2009-04-07 31 views
79

Aynı yapıya sahip iki MySQL tablasını nasıl birleştirebilirim?İki MySQL tablosunu nasıl birleştirebilirim?

İki tablonun birincil anahtarları çatışacaktır, dolayısıyla bunu dikkate aldım.

+6

Eğer BA'lar çatışma olabileceğini söylüyorlar yinelenen satırlar olabilir anlamına yapmak ve bunları kopyalanan istiyorsanız veya onlar çünkü bunlardan birine yeni bir PK atamak gerektiğini yok Aynı PK'ye sahip olmasına rağmen gerçekten farklı satırlar?(doğal birincil anahtarları kullanmak için başka bir neden) –

cevap

105

:

hala yeni birincil anahtarlar ile satırları sokulurken, eşleşen bir birincil anahtara sahip olduğunu table_2 olanlar yerini alacak table_1 bu satırları verir
INSERT IGNORE 
    INTO table_1 
SELECT * 
    FROM table_2 
    ; 

. yeni bir birincil anahtarları ile satır sokulurken

Alternatif

,

REPLACE 
    INTO table_1 
SELECT * 
    FROM table_2 
     ; 

zaten table_2 karşılık gelen sıra ile table_1 bu satır güncellenir.

Sen güncellemek için bir komut dosyası yazabilirsiniz
+2

, birçok tablodan olabilir mi? – SaidbakR

+1

Aslında, [REPLACE] (http://code.openark.org/blog/mysql/replace-into-think-twice) mevcut satırları (silme + ekleme) güncelleyecektir. –

13

bunu elle yapmanız gerekiyorsa, bir kez: Sonra

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

gibi bir şeyle birincil anahtar kısıtlamaları tanımlamak:

Birincisi, böyle bir şeyle, geçici tabloda birleştirme

SELECT COUNT(*), PK from MERGED GROUP BY PK HAVING COUNT(*) > 1 
PK birincil anahtar alanıdır

...

dupl çözün icates.

Tabloyu yeniden adlandırın.

[düzenlenebilir - aşağıdaki açıklamada hataya neden oldu UNION terimi uzaklaştırıldı parantez,]

+0

Bunu denediğimde bu hatayı aldım, "ERROR 1064 (42000): SQL sözdiziminde bir hata var; doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen elkitabını kontrol edin '' UNION select * aktörden '' satırında kullanmak için ', neden bu? – jcho360

19
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

İyi fikir için teşekkürler. Yukarıdaki cmd bana bir sözdizimi hatası verir. Ama bu benim için çalışıyor: YİNELENEN KEY UPDATE second_table DAN first_table SELECT'te * INTO INSERT second_table.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH – Tapper

+0

Sadece @Tapper gibi (first_table.column1), ilk bir Alias ​​atamak alamadım tablo. Yine de MySQL Workbench aracılığıyla 'Syntax hatası, beklenmedik IDENT_QUOTED 'olurdum. – blo0p3r

35

Bu birincil anahtarın semantik bağlıdır. PK şey demektir Eğer önceliğe sahip olmalıdır hangi kayıt belirlemek için bir yol bulmalıyız,

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

: sadece autoincrement varsa, bu durumda böyle bir şey kullanın. Önce kopyaları bulmak için bir seçim sorgusu oluşturabilirsiniz (bkz. answer by cpitis). Ardından, kalanları eklemek için yukarıdaki eki kullanmak ve kullanmak istemediğinizi ortadan kaldırın. Ayrıca deneyebilirsiniz

0

FK Diyelim ki .. Bu blog kontrol için: http://multunus.com/2011/03/how-to-easily-merge-two-identical-mysql-databases/

Onlar "id" sütunlarını almak için information_schema tabloları kullanmak için bir akıllı komut dosyası vardır:

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[email protected] and column_name like '%id' into outfile 'update_ids.sql'; 

use id_new 
source update_ids.sql; 
5

Göründüğü kadar karmaşık değil .... Sadece yinelenen birincil anahtarını sorgunuzdan çıkartın .... bu benim için çalışıyor!

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 
İlgili konular