Bagaimana cara menggabungkan dua tabel MySQL?

92

Bagaimana cara menggabungkan dua tabel MySQL yang memiliki struktur yang sama?

Kunci utama dari dua tabel akan bentrok, jadi saya telah memperhitungkannya.

Steve McLeod
sumber
6
Ketika Anda mengatakan bahwa PK mungkin bentrok, maksud Anda mungkin ada baris duplikat dan Anda tidak ingin mereka disalin, atau bahwa Anda perlu menetapkan PK baru ke salah satu dari mereka karena baris tersebut benar-benar berbeda meskipun memiliki baris PK yang sama? (alasan lain untuk menggunakan kunci primer alami)
Tom H

Jawaban:

123

Anda juga bisa mencoba:

INSERT IGNORE
  INTO table_1 
SELECT *
  FROM table_2
     ;

yang memungkinkan baris tersebut di tabel_1 untuk menggantikan baris di tabel_2 yang memiliki kunci utama yang cocok, sambil tetap menyisipkan baris dengan kunci utama baru.

Kalau tidak,

REPLACE
   INTO table_1
 SELECT *
   FROM table_2
      ;

akan memperbarui baris yang sudah ada di table_1 dengan baris yang sesuai dari table_2, sambil menyisipkan baris dengan kunci primer baru.

fcw
sumber
2
Sebenarnya, ini akan MENGGANTI baris yang ada (hapus + sisipkan), bukan pembaruan.
Cees Timmerman
bagaimana jika ada kunci asing yang digunakan untuk tabel 2 ????? Bagaimana Anda akan memperbaruinya?
Kshitiz
39

Itu tergantung pada semantik kunci utama. Jika itu hanya autoincrement, maka gunakan sesuatu seperti:

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

Jika PK berarti sesuatu, Anda perlu menemukan cara untuk menentukan rekaman mana yang harus diprioritaskan. Anda dapat membuat kueri pemilihan untuk menemukan duplikat terlebih dahulu (lihat jawaban dengan cpitis ). Kemudian hilangkan yang tidak ingin Anda simpan dan gunakan sisipan di atas untuk menambahkan catatan yang tersisa.

Milan Babuškov
sumber
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)
Quassnoi
sumber
1
Terima kasih untuk ide yang bagus. Cmd di atas memberi saya kesalahan sintaks. Tapi ini berfungsi untuk saya: INSERT INTO first_table SELECT * FROM second_table ON DUPLICATE KEY UPDATE second_table.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH (first_table.column1)
Tapper
Sama seperti @Tapper, saya tidak bisa menetapkan Alias ​​ke tabel pertama. Saya akan mendapatkan Syntax error, unexpected IDENT_QUOTED- melalui MySQL Workbench.
blo0p3r
Bisakah Anda memberikan contoh perintah apa yang akan Anda masukkan pada baris terakhir? Saya ingin ID bertambah dari ID tertinggi yang ada di tabel
Elliott B
15

Jika Anda perlu melakukannya secara manual, satu kali:

Pertama, gabungkan dalam tabel sementara, dengan sesuatu seperti:

create table MERGED as select * from table 1 UNION select * from table 2

Kemudian, identifikasi kendala kunci utama dengan sesuatu seperti

SELECT COUNT(*), PK from MERGED GROUP BY PK HAVING COUNT(*) > 1

Di mana PK adalah bidang kunci utama ...

Pecahkan duplikat.

Ubah nama tabel.

[diedit - tanda kurung yang dihapus dalam kueri UNION, yang menyebabkan kesalahan pada komentar di bawah]

Cătălin Pitiș
sumber
ketika saya mencoba ini saya menerima kesalahan ini, "ERROR 1064 (42000): Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat 'UNION pilih * dari aktor)' pada baris ", mengapa demikian?
jcho360
7

Tidak serumit kedengarannya .... Biarkan saja kunci utama duplikat dari kueri Anda .... ini berfungsi untuk saya!

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
Bill Warren
sumber
0

Anda dapat menulis skrip untuk memperbarui FK untuk Anda .. lihat blog ini: http://multunus.com/2011/03/how-to-easily-merge-two-identical-mysql-databases/

Mereka memiliki skrip pintar untuk menggunakan tabel information_schema untuk mendapatkan kolom "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;
TimoSolo
sumber