我正在使用pdo
处理我的数据库,我刚刚注意到,当我尝试使用ON DUPLICATE KEY UPDATE
插入多行时,自动递增字段(在我的情况下,它称为id
)。
这是我的桌子:
id | name | age
1 | Emma | 20
2 | Jane | 21
3 | John | 25
我的发言是:
$pdo->prepare('
INSERT INTO person
(`name`, `age`)
VALUES
(?, ?), (?, ?), (?, ?)
ON DUPLICATE KEY UPDATE
age = VALUES(`age`)
')->execute(['Emma', '20', 'Jane', '21', 'Sarah', '35']);
如果我运行此查询,它将插入ID为name: Sarah
(age: 35
个ID的6
,2
。为什么会这样呢?对此有解决方案吗?
(我希望它可以与多行插入一起使用)
答案 0 :(得分:0)
这是auto_increment
值的预期行为。每次您在其上运行INSERT
时,它都会增加该值。即使该插入由于已存在唯一值而失败。因此,即使您的查询中有一个ON DUPLICATE KEY
值,它仍然会尝试INSERT
一次,直到意识到它们已经在其中。
如果您要解决此问题,可以将查询分为两个部分,首先尝试SELECT
个用户,然后在发现它们不存在时,INSERT
个用户。这样,您就不会尝试INSERT
可能已经存在的任何值,因此不会增加auto_increment
的值。
编辑:您也可以使用自动增量锁定模式进行操作。我不确定这是否可靠,但是您可以在此处找到一些相关信息:https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html