mySQL INSERT INTO ON DUPLICATE KEY - 不知道什么不行

时间:2015-03-21 03:20:52

标签: php mysql pdo insert-into on-duplicate-key

我只是尝试在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");

哪一个都一样,对吧?

好吧,如果有人能帮助我,我会非常高兴。我一定做错了......

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。我不认为上述逻辑在所有存储引擎中都是多用户安全的,但它可能会解决您的问题。