问题:
insert on duplicate key update
在仅限PHP 和仅限Xampp / Windows
测试代码:
$connection = new \PDO('mysql:dbname=XXXXXXXXX;host=XXXXXXXX', 'XXXXXXXX', 'XXXXXXXX');
$query = 'insert into `test` (test) VALUES (1) on duplicate key update test=1';
$connection->exec($query);
Mysql架构:
CREATE TABLE IF NOT EXISTS `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`test` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
服务器:
XAMPP-win32-7.0.18-0-VCl 4
其他信息:
编辑:
如下所述,这个问题似乎很容易被误解。我知道条件插入/更新一行需要一个密钥。这不是意图,也不是问题。鉴于未使用密钥的情况,IODKU语句应在每次运行时插入一行。运行1次后插入2行
答案 0 :(得分:1)
也许您可以通过将代码更改为以下内容来测试某些内容:
$connection = new \PDO('mysql:dbname=XXXXXXXXX;host=XXXXXXXX', 'XXXXXXXX', 'XXXXXXXX');
$query = 'insert into `test` (test) VALUES (1) on duplicate key update test=1';
$connection->exec($query);
$query = 'insert into `test` (test) VALUES (2) on duplicate key update test=2';
$connection->exec($query);
现在结果可以是以下之一:
1。 1 2
2。 1 1 2 2
3. 1 2 1 2
在第一种情况下,一切都很好。
如果插入了第二种情况,那么系统中就存在错误。 PDO driver
或MySQL server
,但我确信这是您安装中的一些奇怪故障。全新安装或其他机器很可能不会遇到此问题。
如果第三件事发生,那么你的PHP
脚本会运行两次。这可能是PHP installation
本身的问题,或者可能是由于某种原因实际上存在对脚本的第二次调用,无论是重定向还是其他设置。
无论如何,这不是我们可以解决的问题。你的代码工作正常。您可以在单独的计算机上尝试全新安装。由于我了解您对所有测试使用相同的PHP server
和不同的mysql servers
,我的赌注是新的PHP server
可以解决此问题。
但是在另一台机器上全新安装它总是确保它实际上是一个bug的最佳方法。在这种情况下,您可以向系统管理员或所涉及的任何工具发布错误报告。
答案 1 :(得分:0)
要使用IODKU,您必须在要设置的列的一个(或组合)上有一个UNIQUE
键。对于提供的查询,您需要在表定义中使用它:
UNIQUE(test)
另一方面,也许你真的不需要IODKU来做你想做的事情。意图是什么?