2009-04-07 7 views
79

Comment puis-je fusionner deux tables MySQL qui ont la même structure?Comment puis-je fusionner deux tables MySQL?

Les clés primaires des deux tables s'affrontent, j'en ai donc tenu compte.

+6

Quand vous dites que les clés primaires pourraient entrer en conflit, voulez-vous dire qu'il pourrait y avoir des lignes en double et vous ne voulez pas les copier, ou que vous devez attribuer un nouveau PK à l'un d'entre eux parce qu'ils sont lignes vraiment différentes malgré avoir le même PK?(encore une autre raison d'utiliser les clés primaires naturelles) –

Répondre

105

Vous pouvez aussi essayer:

INSERT IGNORE 
    INTO table_1 
SELECT * 
    FROM table_2 
    ; 

qui permet à ces lignes dans table_1 pour remplacer ceux table_2 qui ont une clé primaire correspondant, tout en insérant encore des lignes avec de nouvelles clés primaires. avec de nouvelles clés primaires

En variante,

REPLACE 
    INTO table_1 
SELECT * 
    FROM table_2 
     ; 

mettra à jour les lignes déjà en table_1 avec la rangée correspondante de TABLE_2, tandis que l'insertion de lignes.

+2

pourrait-il être de nombreuses tables? – SaidbakR

+1

En fait, il va [REPLACE] (http://code.openark.org/blog/mysql/replace-into-think-twice) lignes existantes (supprimer + insérer), pas mettre à jour. –

13

Si vous devez le faire manuellement, une fois:

D'abord, la fusion dans une table temporaire, avec quelque chose comme:

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

Ensuite, identifier les contraintes de clé primaire avec quelque chose comme

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

Où PK est la clé primaire ...

Résoudre le DUPL des glaçons.

Renommez la table.

[édité - crochets supprimés dans la requête UNION, qui a été à l'origine de l'erreur dans le commentaire ci-dessous]

+0

lorsque j'essaie cela, j'ai reçu cette erreur, "ERREUR 1064 (42000): Vous avez une erreur dans votre syntaxe SQL, consultez le manuel correspondant à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'UNION select * de l'acteur)' at line ', pourquoi est-ce? – 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

Merci pour la bonne idée. La cmd ci-dessus me donne cependant une erreur de syntaxe. Mais cela fonctionne pour moi: INSERT DANS first_table SELECT * DE second_table SUR DUPLICATE KEY UPDATE second_table.column1 = DO_WHAT_EVER_MUST_BE_DONE_ON_KEY_CLASH (first_table.column1) – Tapper

+0

Tout comme @Tapper, je ne pouvais pas attribuer un alias à la première table. J'obtiendrais 'Syntax error, inattendu IDENT_QUOTED' - via MySQL Workbench de toute façon. – blo0p3r

35

Cela dépend de la sémantique de la clé primaire. Si c'est juste l'auto-incrémentation, utilisez quelque chose comme:

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

Si PK signifie quelque chose, vous devez trouver un moyen de déterminer quel enregistrement devrait avoir la priorité. Vous pouvez créer une requête select pour rechercher les doublons en premier (voir answer by cpitis). Puis éliminez ceux que vous ne voulez pas conserver et utilisez l'insertion ci-dessus pour ajouter les enregistrements qui restent.

0

Vous pouvez écrire un script pour mettre à jour le FK est pour vous .. vérifier ce blog: http://multunus.com/2011/03/how-to-easily-merge-two-identical-mysql-databases/

Ils ont un script intelligent pour utiliser les tables de information_schema pour obtenir les colonnes « 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 [email protected] and column_name like '%id' into outfile 'update_ids.sql'; 

use id_new 
source update_ids.sql; 
5

Pas aussi compliqué que cela puisse paraître .... Laissez simplement la clé primaire en double dans votre requête .... ça marche pour moi!

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 
Questions connexes