Как я могу объединить две таблицы MySQL, которые имеют одинаковую структуру?
Первичные ключи двух таблиц будут сталкиваться, поэтому я учитываю это.
Как я могу объединить две таблицы MySQL, которые имеют одинаковую структуру?
Первичные ключи двух таблиц будут сталкиваться, поэтому я учитываю это.
Вы также можете попробовать:
INSERT IGNORE
INTO table_1
SELECT *
FROM table_2
;
который позволяет этим строкам в таблице_1 замещать те строки в таблице_2, которые имеют соответствующий первичный ключ, все еще вставляя строки с новыми первичными ключами.
В качестве альтернативы
REPLACE
INTO table_1
SELECT *
FROM table_2
;
обновит эти строки уже в таблице_1 соответствующей строкой из таблицы_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
Вы можете написать script, чтобы обновить FK для вас.. посмотрите этот блог: http://multunus.com/2011/03/how-to-easily-merge-two-identical-mysql-databases/
У них есть умный script, чтобы использовать таблицы 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 [email protected] and column_name like '%id' into outfile 'update_ids.sql';
use id_new
source update_ids.sql;