Как я могу объединить две таблицы MySQL?
Как я могу объединить две таблицы MySQL, которые имеют одинаковую структуру?
первичные ключи двух таблиц будут конфликтовать, поэтому я должен принять это во внимание.
6 ответов:
вы также можете попробовать:
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 что-то означает, вам нужно найти способ определить, какая запись должна иметь приоритет. Вы можете создать запрос select, чтобы сначала найти дубликаты (см. ответ 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-поле первичного ключа...
удалите дубликаты.
переименовать таблицу.
[отредактировано-удалены скобки в запросе объединения, что вызвало ошибку в комментарии ниже]
Не так сложно, как кажется.... Просто оставьте дубликат первичного ключа из вашего запроса.... это работает для меня !
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;