2013-02-09 84 views
2

我想用INSERT ... ON DUPLICATE KEY UPDATE执行一点点复杂的upsert操作。但我无法实现它的工作。MySQL upsert with extra check

这是我想要做什么:

  1. 尝试插入一条记录。如果插入成功,那很好。
  2. 如果该记录存​​在,请更新记录。
  3. 更新记录时,如果check_status字段为1,则保留说明和注释字段。
  4. 更新记录时,它的check_status字段为0,然后更新描述和注释字段。

之前写出来的SQL,让我们假设存在some_table有如下记载:

column name  | val 
-----------------+------------------------- 
some_unique_key | 32 
description  | existing description 
comment   | existing comment 
check_status  | 1 

所以为了做到我上面描述的操作,我使用的SQL如下:

INSERT INTO some_table ('description', 'comment', 'some_unique_key') 
VALUES ('some description', 'some comment', 32) 
ON DUPLICATE KEY UPDATE 
description = IF(check_status = 1, VALUES(description), 'some description') 
comment = IF(check_status = 1, VALUES(comment), 'some comment') 

我认为VALUES(描述)会给我数据库表中现有记录的值(即'现有描述')。但是,它似乎给了我想要插入的东西,即'一些描述'。

有没有人知道如何正确使用SQL来做到这一点。尝试插入时引用现有记录中值的最佳方法是什么?

回答

5

简单。不要使用VALUES()(你已经在做了,指的是check_status现有的值):

INSERT INTO some_table ('description', 'comment', 'some_unique_key') 
VALUES ('some description', 'some comment', 32) 
ON DUPLICATE KEY UPDATE 
description = IF(check_status = 1, description, 'some description') 
comment = IF(check_status = 1, comment, 'some comment') 

或者用它来设置新的内容,而不是重复自己:

INSERT INTO some_table ('description', 'comment', 'some_unique_key') 
VALUES ('some description', 'some comment', 32) 
ON DUPLICATE KEY UPDATE 
description = IF(check_status = 1, description, VALUES(description)) 
comment = IF(check_status = 1, comment, VALUES(comment)) 
+0

哈哈。哎唷,就这么简单!谢谢你的回答@eggyal! – 2013-02-09 23:44:42