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

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

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



답변

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

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의 해당 행으로 업데이트합니다.


답변

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

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

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


답변

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)


답변

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

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

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 쿼리에서 제거 된 대괄호로 인해 아래 주석에 오류가 발생했습니다.]


답변

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

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


답변

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;


답변