Как объединить две таблицы MySQL с одинаковой структурой?
Первичные ключи двух таблиц будут конфликтовать, поэтому я должен это принять во внимание.
Как объединить две таблицы MySQL с одинаковой структурой?
Первичные ключи двух таблиц будут конфликтовать, поэтому я должен это принять во внимание.
Ответы:
Вы также можете попробовать:
INSERT IGNORE
INTO table_1
SELECT *
FROM table_2
;
который позволяет тем строкам в таблице_1 заменять те строки в таблице_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)
Syntax error, unexpected IDENT_QUOTED
- через MySQL Workbench.
Если вам нужно сделать это вручную, один раз:
Сначала слейте во временную таблицу что-то вроде:
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/
У них есть умный сценарий для использования таблиц information_schema для получения столбцов "id":
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;