我的表格中包含record_id
列(自动增值税),sender
,sent_time
和status
。
如果没有特定发件人的任何记录,例如“sender1”,我必须插入新记录,否则我必须更新属于“user1”的现有记录。
因此,如果没有任何记录存储,我会执行
# record_id is AUTO_INCREMENT field
INSERT INTO messages (sender, sent_time, status)
VALUES (@sender, time, @status)
否则我会执行UPDATE语句。
无论如何..有没有人知道如果没有任何记录,如果字段发送者值是“user1”,那么如何组合这两个语句以插入新记录,否则更新现有记录?
答案 0 :(得分:47)
MySQL支持insert-on-duplicate语法,例如:
INSERT INTO table (key,col1) VALUES (1,2)
ON DUPLICATE KEY UPDATE col1 = 2;
答案 1 :(得分:12)
如果您对表格有严格限制,那么您也可以使用REPLACE INTO
。这是MySQL的一个引用:
REPLACE的工作原理与INSERT完全相同,只是如果表中的旧行与PRIMARY KEY或UNIQUE索引的新行具有相同的值,则在插入新行之前删除旧行。
语法与INSERT INTO
基本相同,只需将INSERT
替换为REPLACE
。
INSERT INTO messages (sender, sent_time, status) VALUES (@sender, time, @status)
然后
REPLACE INTO messages (sender, sent_time, status) VALUES (@sender, time, @status)
请注意,这是一个特定于MySQL的命令,在其他数据库中不会出现,因此请记住可移植性。
答案 2 :(得分:3)
正如其他人所提到的,你应该使用“插入...复制密钥更新”,有时也称为“upsert”。但是,在您的特定情况下,您不希望在更新中使用静态值,而是将值传递给insert语句的values子句。
具体来说,如果行已经存在,我想你想要更新两列:
1) sent_time
2) status
为了做到这一点,你可以使用像这样的“upsert”语句(使用你的例子):
INSERT INTO messages (sender, sent_time, status)
VALUES (@sender, time, @status)
ON DUPLICATE KEY UPDATE
sent_time = values(sent_time),
status = values(status);
答案 3 :(得分:2)
查看"Insert on Duplicate Key Update"。
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;
答案 4 :(得分:1)
一种选择是使用重复更新语法
http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html
其他选项是选择确定记录是否存在,然后相应地进行inser / update。请注意,如果您正在使用事务,则select将不会显式终止事务,因此使用它是安全的。
答案 5 :(得分:0)
use merge statement :
merge into T1
using T2
on (T1.ID = T2.ID)
when matched
then update set
T1.Name = T2.Name
when not matched
then insert values (T2.ID,T2.Name);