使用ON DUPLICATE UPDATE

时间:2018-09-27 11:19:44

标签: php pdo

我正在使用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: Sarahage: 35个ID的62。为什么会这样呢?对此有解决方案吗?

(我希望它可以与多行插入一起使用)

1 个答案:

答案 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