2010-04-08 7 views
0

J'ai une table avec des données de champ incomplètes dans chacune de ses lignes que je veux réparer.Mysql "safe" merge

Voici un ce que je veux dire:

mysql> CREATE TABLE test (
     key INT 
     a CHAR(1), 
     b CHAR(1), 
     c CHAR(1), 
    ); 
mysql> CREATE TABLE test2 (
     key INT 
     a CHAR(1), 
     b CHAR(1), 
     c CHAR(1), 
    ); 
mysql> INSERT INTO test (1,'','',''); 
mysql> INSERT INTO test (2,'X','',''); 
mysql> INSERT INTO test (3,'','Y',''); 

mysql> INSERT INTO test2 (2,'X','','Z'); 
mysql> INSERT INTO test2 (4,'X','Y','Z'); 

Je voudrais non-destructive « fusionner » les données test2 en test basé sur le champ « clé » de sorte que:

  • si un champ en test a déjà une valeur non vide pour une clé donnée, elle est conservée.
  • Si un champ en test a une valeur vide et que le champ correspondant dans test2 n'est pas vide, la valeur de test2 remplace le champ correspondant dans test pour une clé donnée.
  • si les champs test et test2 sont non vides et diffèrent, ne faites rien.

Après les « fusion » Je voudrais les données de la table « test » pour ressembler:

(1,'','',''); 
(2,'X','','Z'); 
(3,'','Y',''); 
(4,'X','Y','Z'); 

Un peu comme remplissant les trous dans la table de test sans rien démolir.

Quelqu'un peut-il penser à un moyen de faire cela?

Répondre

1

MySQL dispose d'une fonction spéciale pour ce cas :)

INSERT INTO test2 VALUES (2, 'X', '', 'Z') 
ON DUPLICATE KEY UPDATE a='X', c='Z'; 
INSERT INTO test2 VALUES (4, 'X', 'Y', 'Z') 
ON DUPLICATE KEY UPDATE a='X', b='Y', d='Z'; 
+0

Wow, vous tous sont incroyables! Dans les 10 minutes, j'obtiens exactement la bonne réponse à un problème qui me tue depuis des jours! Merci beaucoup, WoLpH! Je l'apprécie vraiment vraiment! Paul – KellerPaul

+0

De rien KellerPaul :) Aussi, si vous voulez simplement insérer sans fusionner mais que vous voulez ignorer les lignes existantes, vous pouvez utiliser 'INSERT IGNORE INTO' – Wolph