Php mySQL在重复密钥上插入-不知道什么不起作用
我只是尝试在重复键mySQL查询中插入一个INSERT来开始工作。不幸的是没有运气。 我在stackoverflow上读了很多关于这件事的帖子,我看了一下,但还是没有运气 我有一张这样的桌子:Php mySQL在重复密钥上插入-不知道什么不起作用,php,mysql,pdo,insert-into,on-duplicate-key,Php,Mysql,Pdo,Insert Into,On Duplicate Key,我只是尝试在重复键mySQL查询中插入一个INSERT来开始工作。不幸的是没有运气。 我在stackoverflow上读了很多关于这件事的帖子,我看了一下,但还是没有运气 我有一张这样的桌子: ------------------------------------------------- | id | option1 | option 2 | option 3 | option 4 | ------------------------------------------------- | 8
-------------------------------------------------
| id | option1 | option 2 | option 3 | option 4 |
-------------------------------------------------
| 83 | 0 | 1 | 0 | 0 |
$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");
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;
我的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异常中得到任何错误消息,但是我无法更新我的数据库。
让我们假设所有关于连接到数据库的内容都正常(因为我可以选择数据)
我也尝试过这样的符号:
-------------------------------------------------
| id | option1 | option 2 | option 3 | option 4 |
-------------------------------------------------
| 83 | 0 | 1 | 0 | 0 |
$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");
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;
或
都是一样的,对吧
好的,如果有人能在这里帮助我,我将非常高兴。我一定是做错了什么…您不希望重复键更新
。这要么插入新行,要么更新旧行。您似乎想插入新行,但在发生冲突时使用不同的id
我可以这样建议:
-------------------------------------------------
| id | option1 | option 2 | option 3 | option 4 |
-------------------------------------------------
| 83 | 0 | 1 | 0 | 0 |
$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");
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。我不认为上述逻辑在所有存储引擎中都是多用户安全的,但它可能会解决你的问题。表上有唯一的索引吗?是的,正如我所说。我的id列是唯一的。如果我使用一个类似这样的查询,如果我打印它$this->sql=“在重复键更新option1=VALUES(option1);”;
我得到了一个id=0,option1=1的数据库行。我想我还是有点困惑。(提到这个查询现在有绑定选项,我在后面的语句中也绑定了这些选项。我发现复制键可能会执行我的'id=VALUES(id'),并将其更改为option1=VALUES(option1)。至少我在数据库中看到了一些更改,但仍然不是正确的更改…非常感谢您的帮助。我找到了它…我使用了:$this->sql=”在重复键更新option1=VALUES(option1)上向myTable中插入('id','option1')值(83,0)“这实际上是我在你回答之前的代码。我只是在第一个括号部分犯了一个错误。有了这个代码,我在选项1上有一个更新,我的id是83,如果id 83不存在,我会得到一个插入。我想这很好。因为我想插入或更新,这正是我想要的。。。