Comment puis-je fusionner deux tables MySQL ayant la même structure?
Les clés primaires des deux tables vont entrer en conflit, je dois donc en tenir compte.
Vous pouvez aussi essayer:
INSERT IGNORE
INTO table_1
SELECT *
FROM table_2
;
qui permet aux lignes de la table_1 de remplacer celles de la table_2 ayant une clé primaire correspondante, tout en insérant des lignes avec de nouvelles clés primaires.
Alternativement
REPLACE
INTO table_1
SELECT *
FROM table_2
;
mettra à jour les lignes déjà présentes dans table_1 avec les lignes correspondantes de table_2, lors de l'insertion de lignes avec de nouvelles clés primaires.
Cela dépend de la sémantique de la clé primaire. Si c'est juste auto-incrémenté, 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 doit avoir la priorité. Vous pouvez créer une requête select pour rechercher d’abord les doublons (voir réponse par cpitis ). Éliminez ensuite ceux que vous ne souhaitez pas conserver et utilisez l’insertion ci-dessus pour ajouter les enregistrements restants.
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)
Si vous devez le faire manuellement, une fois:
Tout d’abord, fusionnez dans une table temporaire, avec quelque chose comme:
create table MERGED as select * from table 1 UNION select * from table 2
Ensuite, identifiez les contraintes principales avec quelque chose comme
SELECT COUNT(*), PK from MERGED GROUP BY PK HAVING COUNT(*) > 1
Où PK est le champ de clé primaire ...
Résoudre les doublons.
Renommez la table.
[édité - Suppression des crochets dans la requête UNION, ce qui causait l'erreur dans le commentaire ci-dessous]
Pas aussi compliqué que ça en a l'air .... Laissez simplement la clé primaire en double de 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
Vous pouvez écrire un script pour mettre à jour les FK pour vous .. consultez ce blog: http://multunus.com/2011/03/how-to-easily-merge-two-identical-mysql-databases/
Ils ont un script intelligent pour utiliser les tables information_schema afin d’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 table_schema=@db and column_name like '%id' into outfile 'update_ids.sql';
use id_new
source update_ids.sql;