mysql - ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id) 不增加 autoindex

标签 mysql sql duplicates

我正在运行一个 SQL 查询,看起来有点像这样

INSERT INTO people (Name, Role)
VALUES('{$Name}', '{$Occupation')
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)

'people' 表有一个代理 ID 键作为主键,由 MySQL 的 Autoindex 设置。

“名称”和“角色”组合在一起作为复合唯一键。

问题是,当我运行此查询并命中具有相同名称和角色的人并获取他们各自的 ID 时,自动索引仍然增加。

是否可以轻松避免这种情况,或者我是否需要运行 2 个单独的查询来检查是否已经存在然后插入?

最佳答案

首先,如果自动增量增加,您不必担心。不可否认,它在美学上是“丑陋的”,但序列中的间隙应该无关紧要。并且,由于其他原因可能会出现差距。

但是,如果这很重要,您可以通过检查查询来降低它发生的可能性:

INSERT INTO people (Name, Role)
    SELECT name, role
    FROM (SELECT '{$Name}' as name, '{$Occupation}' as role) x
    WHERE NOT EXISTS (SELECT 1 FROM people p WHERE p.name = x.name)
    ON DUPLICATE KEY UPDATE name = VALUES(name);  -- no op;

您仍然可以获得可能出现间隙的竞争条件,但这会降低这种可能性。

关于mysql - ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id) 不增加 autoindex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40516110/

相关文章:

mysql - 限制属性的SQL语句

MySQL 列出所有重复项

php - 非重复的mysql查询php mysql

java - 合并 map 中的条目

php - 是否可以同时查询具有更多耦合值的表?

php - 虽然循环不打印所有答案

mysql - 存储过程挂起

mysql - 使用通配符在 MySQL 中搜索反斜杠时执行 LIKE 时的奇怪行为

sql - 奇怪的 SQL 结果

mysql - 是否有 "best way"来短路 mysql 查询