두 개의 MySQL 테이블을 병합하려면 어떻게해야합니까?


92

동일한 구조를 가진 두 개의 MySQL 테이블을 병합하려면 어떻게해야합니까?

두 테이블의 기본 키가 충돌하므로이를 고려했습니다.


6
PK가 충돌 할 수 있다고 말할 때, 중복 행이있을 수 있고 복사를 원하지 않는 것입니까, 아니면 새 PK를 그 중 하나에 할당해야 함을 의미합니까? 같은 PK? (자연스러운 기본 키를 사용하는 또 다른 이유)
Tom H

답변:


123

다음을 시도해 볼 수도 있습니다.

INSERT IGNORE
  INTO table_1 
SELECT *
  FROM table_2
     ;

이를 통해 table_1의 해당 행이 일치하는 기본 키가있는 table_2의 행을 대체하면서 새 기본 키가있는 행을 계속 삽입 할 수 있습니다.

또는

REPLACE
   INTO table_1
 SELECT *
   FROM table_2
      ;

새로운 기본 키가있는 행을 삽입하는 동안 table_1에 이미있는 행을 table_2의 해당 행으로 업데이트합니다.


2
사실, 그것은 것입니다 REPLACE 기존 행 (삭제 + 삽입),하지 업데이 트를.
Cees Timmerman

표 2에 사용 된 외래 키가 있다면 어떨까요 ????? 어떻게 업데이트 하시겠습니까?
Kshitiz

39

기본 키의 의미에 따라 다릅니다. 자동 증가 인 경우 다음과 같이 사용하십시오.

insert into table1 (all columns except pk)
select all_columns_except_pk 
from table2;

PK가 의미하는 경우 어떤 레코드가 우선 순위를 가져야하는지 결정하는 방법을 찾아야합니다. 먼저 중복을 찾기 위해 선택 쿼리를 만들 수 있습니다 ( cpitis의 답변 참조 ). 그런 다음 유지하지 않으려는 레코드를 제거하고 위의 삽입을 사용하여 남아있는 레코드를 추가하십시오.


21
INSERT
INTO    first_table f
SELECT  *
FROM    second_table s
ON DUPLICATE KEY
UPDATE
        s.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH(f.column1)

1
좋은 아이디어에 감사드립니다. 위의 cmd는 구문 오류를 제공합니다. 그러나 이것은 나를 위해 작동합니다 : INSERT INTO first_table SELECT * FROM second_table ON DUPLICATE KEY UPDATE second_table.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH (first_table.column1)
Tapper

@Tapper와 마찬가지로 첫 번째 테이블에 별칭을 할당 할 수 없습니다. Syntax error, unexpected IDENT_QUOTED어쨌든 MySQL Workbench를 통해 얻을 것 입니다.
blo0p3r

마지막 줄에 입력 할 명령의 예를 제공 할 수 있습니까? ID가 표에서 가장 높은 기존 ID에서 증가하고 싶습니다
Elliott B

15

수동으로 수행해야하는 경우 한 번 :

먼저 다음과 같은 임시 테이블을 병합합니다.

create table MERGED as select * from table 1 UNION select * from table 2

그런 다음 다음과 같이 기본 키 제약 조건을 식별하십시오.

SELECT COUNT(*), PK from MERGED GROUP BY PK HAVING COUNT(*) > 1

PK가 기본 키 필드 인 경우 ...

중복을 해결하십시오.

테이블 이름을 바꿉니다.

[편집 됨-UNION 쿼리에서 제거 된 대괄호로 인해 아래 주석에 오류가 발생했습니다.]


이것을 시도 할 때 "ERROR 1064 (42000) : SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 설명서에서 'UNION select * from actor)'근처에서 사용할 올바른 구문을 확인하십시오. 줄 ", 그 이유는 무엇입니까?
jcho360

7

들리는 것처럼 복잡하지 않습니다 .... 쿼리에서 중복 된 기본 키를 그대로 둡니다.

INSERT INTO
  Content(
    `status`,
    content_category,
    content_type,
    content_id,
    user_id,
    title,
    description,
    content_file,
    content_url,
    tags,
    create_date,
    edit_date,
    runs
  )
SELECT `status`,
  content_category,
  content_type,
  content_id,
  user_id,
  title,
  description,
  content_file,
  content_url,
  tags,
  create_date,
  edit_date,
  runs
FROM
  Content_Images

0

FK를 업데이트하는 스크립트를 작성할 수 있습니다.이 블로그를 확인하십시오. http://multunus.com/2011/03/how-to-easily-merge-two-identical-mysql-databases/

그들은 "id"열을 얻기 위해 information_schema 테이블을 사용하는 영리한 스크립트를 가지고 있습니다 :

SET @db:='id_new'; 

select @max_id:=max(AUTO_INCREMENT) from information_schema.tables;

select concat('update ',table_name,' set ', column_name,' = ',column_name,'+',@max_id,' ; ') from information_schema.columns where table_schema=@db and column_name like '%id' into outfile 'update_ids.sql';

use id_new
source update_ids.sql;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.