developer tip

MYSQL : 두 번째 테이블에 하나의 추가 열이있는 mysql의 한 테이블에서 다른 테이블로 전체 행을 복사하는 방법은 무엇입니까?

optionbox 2020. 10. 29. 08:04
반응형

MYSQL : 두 번째 테이블에 하나의 추가 열이있는 mysql의 한 테이블에서 다른 테이블로 전체 행을 복사하는 방법은 무엇입니까?


하나의 열을 제외하고 동일한 구조를 가진 두 개의 테이블이 있습니다 ... 테이블 2에는 CURRENT_DATE ()를 삽입 할 추가 열이 있습니다.

table1의 모든 값을 table2로 복사하고 싶습니다.

내가 사용한다면

INSERT INTO dues_storage SELECT * FROM dues WHERE id=5;

열 수의 차이를 지적하는 오류가 발생합니다.

그것에 대해 두 가지 질문이 있습니다.

  1. 이 문제를 어떻게 해결합니까?
  2. 이 동일한 명령문 내에서 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

참고URL : https://stackoverflow.com/questions/1353733/mysql-how-to-copy-an-entire-row-from-one-table-to-another-in-mysql-with-the-sec

반응형