不使用REPLACE INTO或ON DUPLICATE KEY UPDATE

时间:2014-05-15 22:44:07

标签: mysql

在MYSQL中,如果存在行,如何更新(不替换),否则创建新行。

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

基本上我有一个存储电子邮件和其他随机数据的表。我通过 primary-unique-auto-incriminating-number列(id)

将行引用为已保存的会话

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

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

我非常确定两件事:

REPLACE INTO

这看起来会破坏我的id号码,因为这个方法在删除旧的

时会复制该行

ON DUPLICATE KEY UPDATE

这似乎需要比较一个唯一的密钥(id),这不是我需要的,如果我能做的事情会更好:

ON DUPLICATE email UPDATE

或类似的东西(但我认为它不是有效的MYSQL):

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

MYSQL不能成为山脊吗?

2 个答案:

答案 0 :(得分:1)

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

我认为由于某种原因您不需要唯一的电子邮件列。您是否看到多列独特的

例如,如果您对电子邮件和时间戳有唯一索引,则可以使用ON DUPLICATE KEY UPDATE。如果电子邮件首先按照2列的顺序排列,它甚至可以替代非唯一的电子邮件索引。

答案 1 :(得分: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 | existed@email.com

跑完......

INSERT INTO my_table ( a, b, email ) VALUES ( 2, 2, 'existed@email.com' ) 
on duplicate key update a=VALUES(a), b=VALUES(b)

你会有

a | b | email
2 | 2 | existed@email.com

请注意指定要更新的字段,如果不指定,则不会更新!

编辑:现在,使用SQLFiddle显示它正常工作:http://sqlfiddle.com/#!2/79e67/3