web-dev-qa-db-fra.com

Comment puis-je fusionner deux tables MySQL?

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.

90
Steve McLeod

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.

120
fcw

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.

38
Milan Babuškov
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)
21
Quassnoi

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]

15
Cătălin Pitiș

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
7
Bill Warren

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;
0
TimoSolo