检查MySQL条目是否存在,如果存在,则覆盖其他列

时间:2015-10-01 18:55:40

标签: php mysql

我有一个MySQL表格,如下所示

UID | Thing1 | Thing2 | Date

UID列已设置为唯一,并且由用户ID +日期作为整数构成。 I.E 7620150715

我想做的是检查UID是否存在,如果存在,则用最新信息更新列thing1和thing2。

如果UID不存在,则为所有信息创建一个新行。

目前,可以输入的是

$sql = "INSERT INTO things2 (uid, thing1, thing2, date) VALUES (:uid, :thing1,:thing2,:date)";

但是在使UID成为唯一之后,这并不起作用。

我发现ON DUPLICATE KEY UPDATE语句似乎是我正在寻找的,但所有答案似乎都在输入中添加+1,这不是我想要做的。

我正在寻找的一些伪语法就像这样

$sql = "INSERT INTO things2 (uid, thing1, thing2, date) VALUES (:uid, :thing1,:thing2,:date ON DUPLICATE KEY UPDATE (thing1, thing2) VALUES (:thing1, :thing2)";

正确的语法是什么?

2 个答案:

答案 0 :(得分:1)

最简单/最清晰的方法需要两个步骤:

首先执行(新)UID的INSERT或IGNORE。不要为这些值烦恼,因为无论如何你都会更新。只需确保该表允许使用正确的默认值而不是太多约束:

INSERT OR IGNORE INTO things2 (uid) VALUES (:uid)

然后做一个UPDATE ... SET a = b WHERE UID = ..实际更新记录:

UPDATE thing1=:thing1, thing2=:thing2 WHERE UID = :uid

(未经测试,请检查,因为我更喜欢C ++ / sqlite而不是MySql / php)

答案 1 :(得分:1)

你的语法有点不对劲。如果INSERT失败,那么您使用标准的UPDATE语法编写UPDATE,如此。

$sql = "INSERT INTO things2 
               (uid, thing1, thing2, `date`) 
        VALUES (:uid, :thing1,:thing2,:date )
        ON DUPLICATE KEY 
        UPDATE things2 SET thing1 = :thing1, thing2 = :thing2, `date` = :date";

同样date是一个保留字,所以最好用反引号包装它。