【发布时间】:2018-05-01 21:26:36
【问题描述】:
问题:
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-VC14
附加信息:
- 在多个 MySQL 服务器上测试,来自同一个 Web 服务器
- 在 Linux 服务器上进行测试时,同样使用 PHP7,问题已得到修复
- 所以问题似乎出在 php mysql 扩展上
- 我仍在诊断中,但希望可以通过文档解决此问题
编辑:
如下所述,这个问题似乎很容易被误解。我知道插入/更新一行的条件需要一个键。这不是意图,也不是问题。在没有使用键的情况下,IODKU 语句应该在每次运行时插入一行。运行 1 次后插入 2 行
【问题讨论】:
-
显示你的结构,我敢打赌你没有
test作为键。 -
@Forbs 没关系,因为
on duplicate key update不应该插入 多行。如前所述,从具有相同结构的另一台 Web 服务器进行测试时,问题已解决。 -
当然可以,如果它不是 Key,它不会违反重复规则,因此
on duplicate key不会触发,你会得到 2 行。key不是field,它们必须是预定义的 -
@Forbs 这不是指多个陈述。只有一个。我已经发布了上面的结构。您可以在 Linux 服务器上亲自查看
-
正如我所说,没有“重复键”
test不是键...id是。而且因为它是一个自动增量,它会做 2, 3 ,100... 你可能想复习一下键是如何工作的。你说它的工作方式与 linux 服务器不同让我怀疑它。
标签: php mysql xampp mariadb php-7