如果记录已存在,如何插入记录或更新?

时间:2009-12-23 13:50:12

标签: mysql insert insert-update

我的表格中包含record_id列(自动增值税),sendersent_timestatus

如果没有特定发件人的任何记录,例如“sender1”,我必须插入新记录,否则我必须更新属于“user1”的现有记录。

因此,如果没有任何记录存储,我会执行

# record_id is AUTO_INCREMENT field
INSERT INTO messages (sender, sent_time, status)
VALUES (@sender, time, @status)

否则我会执行UPDATE语句。

无论如何..有没有人知道如果没有任何记录,如果字段发送者值是“user1”,那么如何组合这两个语句以插入新记录,否则更新现有记录?

6 个答案:

答案 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);