Comment fusionner deux tables MySQL qui ont la même structure?
Les clés primaires des deux tables entreront en conflit, j'en ai donc tenu compte.
Comment fusionner deux tables MySQL qui ont la même structure?
Les clés primaires des deux tables entreront en conflit, j'en ai donc tenu compte.
Réponses:
Vous pouvez également essayer:
INSERT IGNORE
INTO table_1
SELECT *
FROM table_2
;
qui permet aux lignes de table_1 de remplacer celles de table_2 qui ont une clé primaire correspondante, tout en insérant toujours des lignes avec de nouvelles clés primaires.
Alternativement,
REPLACE
INTO table_1
SELECT *
FROM table_2
;
mettra à jour ces lignes déjà dans table_1 avec la ligne correspondante de table_2, tout en insérant des lignes avec de nouvelles clés primaires.
Cela dépend de la sémantique de la clé primaire. S'il ne s'agit que d'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 doit avoir la priorité. Vous pouvez créer une requête de sélection pour trouver d'abord les doublons (voir réponse par cpitis ). Ensuite, éliminez ceux que vous ne souhaitez pas conserver et utilisez l'insert ci-dessus pour ajouter des enregistrements qui restent.
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)
Syntax error, unexpected IDENT_QUOTED
- par MySQL Workbench de toute façon.
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 de clé primaire avec quelque chose comme
SELECT COUNT(*), PK from MERGED GROUP BY PK HAVING COUNT(*) > 1
Où PK est le champ de clé primaire ...
Résolvez les doublons.
Renommez la table.
[modifié - suppression des crochets dans la requête UNION, ce qui provoquait l'erreur dans le commentaire ci-dessous]
Pas aussi compliqué que cela puisse paraître ... Laissez simplement la clé primaire en double hors de votre requête ... cela fonctionne 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 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 table_schema=@db and column_name like '%id' into outfile 'update_ids.sql';
use id_new
source update_ids.sql;