我刚刚尝试在复制键mySQL查询上插入INTO以开始工作。不幸的是运气不佳。我在stackoverflow读了很多关于这件事的帖子,我看了一下http://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html,但仍然没有运气。。。
我有一张这样的桌子:
-------------------------------------------------
| id | option1 | option 2 | option 3 | option 4 |
-------------------------------------------------
| 83 | 0 | 1 | 0 | 0 |
我的Id是唯一值,但不是自动递增。所有其他值都是描述某些选定选项的布尔值。
我想写一个函数,如果id已经存在,则更新表,或者如果我有新的id,则写新行。
我正在使用数据库类处理现有代码。
$this->db = new PDO($host, $user, $password);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
(不要问我关于setAttribute的问题。这正是代码中的内容…)稍后:
$this->query = $this->db->prepare("INSERT INTO myTable (id, option1, option2, option3, option4)
VALUES (83, 0, 1, 1, 1) ON DUPLICATE KEY UPDATE id = VALUES(id)");
$this->query->execute();
我知道我真的不需要准备任何像捆绑之类的东西。(最后我想这么做,但我不知道如何在这里完成。
我没有从捕获PDO异常中得到任何错误消息,但我无法更新我的数据库。让我们假设所有与连接到DB有关的东西都是可以的(因为我可以选择数据)。
我也尝试过这样的符号:
$this->query = $this->db->prepare("INSERT INTO myTable (id, option1, option2, option3, option4)
VALUES (83, 0, 1, 1, 1) ON DUPLICATE KEY UPDATE id = 83");
或
$this->query = $this->db->prepare("INSERT INTO myTable (id, option1, option2, option3, option4)
VALUES (83, 0, 1, 1, 1) ON DUPLICATE KEY UPDATE id = id + 1");
哪一个都是一样的,对吧?
如果有人能帮我,我会非常高兴的。我一定是做错了什么。。。
您不需要on duplicate key update
。这将插入一个新行。或者更新旧行。您似乎想插入一个新行,但在发生冲突时使用不同的id。
我可能会建议这样的东西:
INSERT INTO myTable(id, option1, option2, option3, option4)
select (case when max(id = 83) > 0 then max(id) + 1
else 83
end), 0, 1, 1, 1
from mytable;
如果83
不存在,这将把它放入表中。如果83
确实存在,它将放入最大值id
+1。
我真的不推荐这个。最好你应该有一个自动递增的id。我不认为上面的逻辑在所有存储引擎中都是多用户安全的,但它可能会解决你的问题。