2010-04-08 57 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