我有一个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)";
正确的语法是什么?
答案 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
是一个保留字,所以最好用反引号包装它。