Как я могу объединить две таблицы MySQL? - PullRequest
88 голосов
/ 07 апреля 2009

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

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

Ответы [ 6 ]

118 голосов
/ 07 апреля 2009

Вы также можете попробовать:

INSERT IGNORE
  INTO table_1 
SELECT *
  FROM table_2
     ;

, которая позволяет тем строкам в таблице_1 заменять те в таблице_2, у которых есть совпадающий первичный ключ, при этом вставляя строки с новыми первичными ключами.

В качестве альтернативы

REPLACE
   INTO table_1
 SELECT *
   FROM table_2
      ;

обновит те строки, которые уже находятся в таблице_1, соответствующей строкой из таблицы_2, при этом вставляя строки с новыми первичными ключами.

37 голосов
/ 07 апреля 2009

Это зависит от семантики первичного ключа. Если это просто автоинкремент, то используйте что-то вроде:

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

Если PK что-то значит, вам нужно найти способ определить, какая запись должна иметь приоритет. Вы можете создать запрос на выборку, чтобы сначала найти дубликаты (см. ответ по cpitis ). Затем удалите те, которые вы не хотите хранить, и используйте указанную выше вставку, чтобы добавить оставшиеся записи.

21 голосов
/ 07 апреля 2009
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)
15 голосов
/ 07 апреля 2009

Если вам нужно сделать это вручную, один раз:

Сначала объедините во временную таблицу что-то вроде:

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, что приводило к ошибке в комментарии ниже]

6 голосов
/ 28 июня 2013

Не так сложно, как кажется ... Просто оставьте дубликат первичного ключа в своем запросе .... это работает для меня!

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
0 голосов
/ 20 августа 2012

Вы могли бы написать скрипт для обновления 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...