2010-04-08 38 views
0

我有一張表,其中每行都有我想修復的不完整字段數據。Mysql「安全」合併

這裏有一個我的意思:

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'); 

我想基於「關鍵」字段非破壞性「合併」 test2的數據到測試,以便:

  • 如果一個字段在測試中已經有一個給定鍵的非空值,它被保留。
  • 如果測試中的字段具有空值並且test2中的相應字段不爲空,則來自test2的值替換測試中的給定鍵的對應字段。
  • 如果test和test2中的字段都是非空的並且不同,則什麼都不做。

的「合併」我想「測試」表中的數據後的樣子:像在測試表上的孔不填充任何重挫

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

類。

任何人都可以想辦法做到這一點?

回答

1

MySQL有一個特殊的功能,這種情況:)

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

哇,你們是令人難以置信! 在10分鐘內,我得到了正確的答案,這個問題一直在困擾着我好幾天! 非常感謝,WoLpH!我真的很感激它! Paul – KellerPaul 2010-04-09 00:01:50

+0

不客氣KellerPaul :) 另外,如果你只是想插入沒有合併,但想忽略現有的行,你可以使用'INSERT IGNORE INTO' – Wolph 2010-04-09 01:20:14