Як я можу об’єднати дві таблиці MySQL?


92

Як я можу об’єднати дві таблиці MySQL, що мають однакову структуру?

Первинні ключі двох таблиць зіткнуться, тому я це врахував.


6
Коли ви говорите, що PK можуть зіткнутися, ви маєте на увазі, що можуть бути повторювані рядки, і ви не хочете, щоб їх копіювали, або що вам потрібно призначити новий PK одному з них, оскільки це справді різні рядки, незважаючи на наявність той самий ПК? (ще одна причина використовувати природні первинні ключі)
Tom H

Відповіді:


123

Ви також можете спробувати:

INSERT IGNORE
  INTO table_1 
SELECT *
  FROM table_2
     ;

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

Як варіант,

REPLACE
   INTO table_1
 SELECT *
   FROM table_2
      ;

оновить ті рядки, які вже є в table_1, відповідним рядком з table_2, одночасно вставляючи рядки з новими первинними ключами.


2
На насправді, це ЗАМІНИТИ існуючі рядки (Delete + Insert), а не її поновлення.
Cees Timmerman

а як бути, якщо для таблиці 2 використовується якийсь зовнішній ключ ????? Як ви це оновите?
Kshitiz

39

Це залежить від семантики первинного ключа. Якщо це просто автоінкремент, використовуйте щось на зразок:

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

Якщо PK щось означає, потрібно знайти спосіб визначити, який запис повинен мати пріоритет. Ви можете створити запит вибору, щоб спочатку знайти дублікати (див. Відповідь cpitis ). Потім усуньте ті, які ви не хочете зберігати, і скористайтесь наведеною вище вставкою, щоб додати записи, які залишились.


21
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)

1
Дякую за гарну ідею. Наведений вище cmd дає мені синтаксичну помилку. Але це працює для мене: ВСТАВЛІТЬ В першу таблицю SELECT * FROM second_table НА ДУБЛІКУВАТИ КЛЮЧ ОНОВЛЕННЯ second_table.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH (first_table.column1)
Tapper

Так само, як @Tapper, я не зміг призначити псевдонім для першої таблиці. Я б все одно Syntax error, unexpected IDENT_QUOTEDпройшов через MySQL Workbench.
blo0p3r

Не могли б ви навести приклад, яку команду ви б ввели в останньому рядку? Я хотів би, щоб ідентифікатор збільшився від найвищого існуючого ідентифікатора в таблиці
Елліотт Б,

15

Якщо вам потрібно зробити це вручну, один раз:

По-перше, об’єднайте у тимчасову таблицю з чимось на зразок:

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, що спричинило помилку в коментарі нижче]


коли я спробую це, я отримав цю помилку, "ПОМИЛКА 1064 (42000): у вас є помилка у вашому синтаксисі SQL; перевірте правильність синтаксису, який слід використовувати біля інструкції, що відповідає версії вашого сервера MySQL, біля" UNION select * from actor) " на лінії ", чому це?
jcho360

7

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

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

Ви можете написати сценарій для оновлення 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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.