MySQL ON DUPLICATE KEY UPDATE 双插入 Xampp PHP7.0

Posted

技术标签:

【中文标题】MySQL ON DUPLICATE KEY UPDATE 双插入 Xampp PHP7.0【英文标题】:MySQL ON DUPLICATE KEY UPDATE double insert on Xampp PHP7.0 【发布时间】: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 服务器不同让我怀疑它。 【参考方案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 driverMySQL server,但我很确定这是您安装中的一些奇怪故障。全新安装或其他机器很可能不会遇到此问题。

如果发生第三件事,那么您的 PHP 脚本会运行两次。这可能是PHP installation 本身的问题,也可能是由于某种原因实际上对脚本进行了第二次调用,无论是重定向还是其他设置。

无论如何,这不是我们可以解决的。您拥有的代码运行良好。您可以在单独的机器上尝试全新安装。由于我了解您对所有测试使用相同的PHP server 和不同的mysql servers,我敢打赌,一个新的PHP server 可以解决这个问题。

但是在另一台机器上重新安装两者始终是确保它实际上是一个错误的最佳方法。在这种情况下,您可以向系统管理员或任何相关工具发布错误报告。

【讨论】:

雨果,你可能正在做某事。 #3 是结果! 你解决了雨果。卸载以前的 Xampp 安装时,我没有停止 Apache 和 MySQL。我猜这就是原因:D【参考方案2】:

要使用 IODKU,您必须在正在设置的一个(或组合)列上有一个 UNIQUE 键。对于提供的查询,您需要在表定义中使用它:

UNIQUE(test)

另一方面,也许您实际上并不需要 IODKU 来完成您正在尝试做的事情。目的是什么?

【讨论】:

感谢您的回复。这个问题似乎很容易被误解。 我知道插入/更新一行的条件需要一个键。这不是意图,也不是问题。鉴于未使用键,IODKU 语句应在每次运行时插入一行。 运行 1 次后插入 2 行 对。好吧,这不是问题/错误的答案。 我再说一遍,我指的错误是运行1次后它是插入2行。在什么世界中,带有一组字段的单个 insert 语句会创建 2 行?请相应回答。

以上是关于MySQL ON DUPLICATE KEY UPDATE 双插入 Xampp PHP7.0的主要内容,如果未能解决你的问题,请参考以下文章

sql UPDATE ON DUPLICATE KEY造成MYSQL死锁现场

mysql insert on duplicate key

mysql ON DUPLICATE KEY UPDATE ;

on duplicate key mysql插入更新

mysql-on duplicate key update实现insertOrUpdate官方文档

(主键策略)ON DUPLICATE KEY UPDATE(Mysql的使用)