我有一个MySQL表,设置如下
UID | Thing1 | Thing2 | Date
UID列被设置为唯一的,由用户ID +日期组成一个整数。即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)";
正确的语法是什么?
你的语法有点错误。如果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
是一个保留字,所以最好用反号把它括起来。最简单/最清楚的方法需要两步:
首先对(新)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)