Как я могу объединить две таблицы MySQL?


Как я могу объединить две таблицы MySQL, которые имеют одинаковую структуру?

первичные ключи двух таблиц будут конфликтовать, поэтому я должен принять это во внимание.

6 84

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;