Comment fusionner deux tables MySql qui ont la même structure ? Les clés primaires des deux tables vont entrer en conflit, je dois donc en tenir compte.
Réponses
Trop de publicités?Vous pouvez également 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 qui ont 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 la table_1 avec la ligne correspondante de la 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. Si c'est juste un auto-incrément, alors 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 (cf. réponse de cpitis ). Ensuite, éliminez ceux que vous ne voulez pas garder et utilisez l'insertion ci-dessus pour ajouter les enregistrements qui restent.
Si vous devez le faire manuellement, une seule fois :
D'abord, fusionner 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 la clé primaire...
Résolvez les doublons.
Renommez la table.
[modifié - suppression des parenthèses dans la requête UNION, qui provoquait l'erreur dans le commentaire ci-dessous].
Pas aussi compliqué qu'il n'y paraît.... Laissez juste la clé primaire dupliquée 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 Contenu_Images