我只是尝试在DUPLICATE KEY mySQL查询中获取INSERT 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异常的消息,但我无法更新我的数据库。 让我们假设有关连接到数据库的所有内容都可以(因为我可以选择数据)。
我也试过这样的符号:
$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");
哪一个都一样,对吧?
好吧,如果有人能帮助我,我会非常高兴。我一定做错了......
答案 0 :(得分:2)
你不想要on duplicate key update
。这会插入 new 行。或者它更新旧行。您似乎想要插入一个新行,但在发生冲突时使用不同的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
放入表中。如果id
确实存在,它会将最大83
+ 1加入。
我没有真的推荐这个。更好的是你应该有一个自动递增ID。我不认为上述逻辑在所有存储引擎中都是多用户安全的,但它可能会解决您的问题。