2014-05-15 102 views
1

在MYSQL中,如果存在其他行,如何更新(而不是替换),否则会创建一个新行。未使用REPLACE INTO或ON DUPLICATE KEY UPDATE

我需要测试的列不是主键,它包含一个电子邮件地址。

基本上我有一个表,用于存储电子邮件和其他随机数据。我由一次独特的自动证其罪数列(ID)

我使用id列指会话数据,而不是电子邮件列的原因是因为邮件引用行作为保存会话由不知道id列存在的用户输入。

编辑:而我没有通过电子邮件引用会话的原因是因为电子邮件太长/不同长度(长故事,但他们使我的QR码所有不同的大小,我不想揭露电子邮件)

我敢肯定的两件事情:

REPLACE INTO 

,这看起来像它会破坏我的身份证号码,因为这方法复制该行同时删除旧

ON DUPLICATE KEY UPDATE 

这似乎需要一个唯一的密钥(ID),这是不是我需要它会更好,如果我可以做类似的比较:

ON DUPLICATE email UPDATE 

或者是这样的(但我不认为它是有效的MYSQL):

var email='[email protected]'; 
var mysql= 
"UPDATE table SET (...) WHERE email='"+email+"' "+ 
"IF @@ROWCOUNT=0 "+ 
"INSERT INTO table VALUES (...)"; 

MYSQL不可能这个可以吗?

回答

0

从文档:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html,您只需使用唯一的关键字段。我的意思是,如果你变换了电子邮件域作为一个独特的领域,在运行:

ALTER TABLE `your_table` ADD UNIQUE INDEX `email` (`email`); 

现在,当您尝试插入行具有相同的邮件,使用INSERT ... ON DUPLICATE KEY UPDATE,它会更新所有字段的值同时保持电子邮件的价值不变:

a | b | email 
1 | 1 | [email protected] 

运行后......

INSERT INTO my_table (a, b, email) VALUES (2, 2, '[email protected]') 
on duplicate key update a=VALUES(a), b=VALUES(b) 

你必须

a | b | email 
2 | 2 | [email protected] 

留意上指定要更新哪些字段,如果不指定,它不会被更新!

编辑:现在,随着SQLFiddle显示它的工作:http://sqlfiddle.com/#!2/79e67/3

+0

我得到这个: #1170 - BLOB /在关键的规格没有一个密钥长度 –

+0

TEXT列“电子邮件”检查我的更新,; D – Chococroc

+0

但是,当我尝试使电子邮件唯一时出现错误...如果出现此错误,它将如何工作? –

1

其实,你自己回答了你的问题: 是的,任何可以回退插入的SQL-buildt-in更新/替换方法都需要一个唯一的字段。 要更新非唯一字段,您必须使用where-condition并检查是否有任何行已被更改。 (保持交易记录)

我看到,由于某种原因你不想要一个独特的电子邮件列。您是否看到您可以有多列独特零件

例如,如果您有一个通过电子邮件和时间戳的唯一索引,则可以使用ON DUPLICATE KEY UPDATE。如果邮件按2列的顺序排在第一位,它甚至会替代非唯一的仅限电子邮件索引。

相关问题