MYSQL : 두 번째 테이블에 하나의 추가 열이있는 mysql의 한 테이블에서 다른 테이블로 전체 행을 복사하는 방법은 무엇입니까?
하나의 열을 제외하고 동일한 구조를 가진 두 개의 테이블이 있습니다 ... 테이블 2에는 CURRENT_DATE ()를 삽입 할 추가 열이 있습니다.
table1의 모든 값을 table2로 복사하고 싶습니다.
내가 사용한다면
INSERT INTO dues_storage SELECT * FROM dues WHERE id=5;
열 수의 차이를 지적하는 오류가 발생합니다.
그것에 대해 두 가지 질문이 있습니다.
- 이 문제를 어떻게 해결합니까?
- 이 동일한 명령문 내에서 table2의 추가 날짜 열 (CURRENT_DATE ())에 대한 값을 어떻게 추가합니까?
Zed의 답변을 수정하고 의견에 답변하려면 :
INSERT INTO dues_storage
SELECT d.*, CURRENT_DATE()
FROM dues d
WHERE id = 5;
TJ Crowder의 의견보기
이를 수행하는 가장 안전한 방법은 삽입 및 추출을 위해 열을 완전히 지정하는 것입니다. 이들 중 하나가 귀하가 생각하는 순서가 될 것이라는 보장은 없습니다 (응용 프로그램에 대한).
insert into dues_storage (f1, f2, f3, cd)
select f1, f2, f3, current_date() from dues where id = 5;
이 작업을 수행하는 여러 PHP 페이지를 변경해야하는 경우 (다른 답변에 대한 주석에서 표시 한 것처럼) 걱정되는 경우 저장 프로 시저에 적합합니다. 이렇게하면 모든 PHP 페이지가 복사 할 ID 만 사용하여 저장 프로 시저를 호출하고 실제 복사 프로세스를 제어합니다. 그렇게하면 코드를 유지 관리해야하는 곳이 한 곳 뿐이며 제 생각에는 DBMS가이를 수행하기에 적합한 곳입니다.
INSERT INTO dues_storage
SELECT field1, field2, ..., fieldN, CURRENT_DATE()
FROM dues
WHERE id = 5;
이것이 누군가를 도울 수 있기를 바랍니다 ... 여기에 제가 작성한 작은 PHP 스크립트가 있습니다. 일부 열만 복사해야하고 다른 열은 복사하지 않고 / 또는 열이 두 테이블에서 동일한 순서가 아닐 경우를 대비해 작성했습니다. 열 이름이 같은 한 작동합니다. 따라서 테이블 A에 [userid, handle, something]이 있고 tableB에 [userID, handle, timestamp]가있는 경우 "SELECT userID, handle, NOW () as timestamp FROM tableA", 그 결과를 얻습니다. 결과를이 함수 ($ z)에 첫 번째 매개 변수로 전달합니다. $ toTable은 복사 할 테이블의 문자열 이름이고 $ link_identifier는 복사 할 DB입니다. 이것은 작은 데이터 세트의 경우 비교적 빠릅니다. 프로덕션 설정에서 이러한 방식으로 한 번에 수천 개 이상의 행을 이동하는 것은 권장되지 않습니다.
function mysql_multirow_copy($z,$toTable,$link_identifier) {
$fields = "";
for ($i=0;$i<mysql_num_fields($z);$i++) {
if ($i>0) {
$fields .= ",";
}
$fields .= mysql_field_name($z,$i);
}
$q = "INSERT INTO $toTable ($fields) VALUES";
$c = 0;
mysql_data_seek($z,0); //critical reset in case $z has been parsed beforehand. !
while ($a = mysql_fetch_assoc($z)) {
foreach ($a as $key=>$as) {
$a[$key] = addslashes($as);
next ($a);
}
if ($c>0) {
$q .= ",";
}
$q .= "('".implode(array_values($a),"','")."')";
$c++;
}
$q .= ";";
$z = mysql_query($q,$link_identifier);
return ($q);
}
Alternatively, you can use Inner Queries to do so.
SQL> INSERT INTO <NEW_TABLE> SELECT * FROM CUSTOMERS WHERE ID IN (SELECT ID FROM <OLD_TABLE>);
Hope this helps!
SET @sql =
CONCAT( 'INSERT INTO <table_name> (',
(
SELECT GROUP_CONCAT( CONCAT('`',COLUMN_NAME,'`') )
FROM information_schema.columns
WHERE table_schema = <database_name>
AND table_name = <table_name>
AND column_name NOT IN ('id')
), ') SELECT ',
(
SELECT GROUP_CONCAT(CONCAT('`',COLUMN_NAME,'`'))
FROM information_schema.columns
WHERE table_schema = <database_name>
AND table_name = <table_source_name>
AND column_name NOT IN ('id')
),' from <table_source_name> WHERE <testcolumn> = <testvalue>' );
PREPARE stmt1 FROM @sql;
execute stmt1;
Of course replace <> values with real values, and watch your quotes.
Just wanted to add this little snippet which works beautifully for me.
INSERT INTO your_target_table SELECT * FROM your_rescource_table WHERE id = 18;
And while I'm at it give a big shout out to Sequel Pro, if you're not using it I highly recommend downloading it...makes life so much easier
'developer tip' 카테고리의 다른 글
인라인 블록 div가 래핑되지 않도록 방지하는 방법은 무엇입니까? (0) | 2020.10.30 |
---|---|
O (log * N)는 무엇입니까? (0) | 2020.10.30 |
Linux 콘솔에서 시각적 차이가 있습니까? (0) | 2020.10.29 |
std :: atomic을 통해 휘발성 한정자가 사용되는 이유는 무엇입니까? (0) | 2020.10.29 |
wget을 사용하여를 확인할 수 있지만 다운로드 할 수는 없습니다. (0) | 2020.10.29 |