MySQL - 如果存在,获取主键。否则,添加条目

标签 mysql

我的表有两列:“id”(自动递增,主要)和“number”(唯一)。现在我想要以下内容:

  • 如果号码已经存在,返回id;
  • 否则,向表中添加条目并返回其 ID。

完成这项工作最有效的方法是什么?

注意:

  • 新号码的概率较大;
  • 该表将包含数十万条记录。

谢谢!

最佳答案

INSERT IGNORE INTO table (number) VALUES (42);

SELECT id FROM table WHERE number = 42;

这可能是 MySQL 中最高效的。您可以使用存储过程将它们集中起来,这可能会或可能不会更有效。

编辑:

如果您认为很少会出现新数字,这会更快:

SELECT id FROM table WHERE number = 42;

if (!id) {

  INSERT INTO table WHERE number = 42;
  id = SELECT @LAST_INSERT_ID;

}

如果并发线程同时选择然后同时插入相同的数字,则此处可能存在竞争条件。在这种情况下,后面的插入将失败。您可以通过在此错误情况下重新选择来从中恢复。

关于MySQL - 如果存在,获取主键。否则,添加条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4475754/

相关文章:

php - laravel 中的时间戳不会更新

mysql - 使用 MySQL 从包含空格的字段中选择

mysql - 识别行的 id 并从数据库中删除该对象

mysql - 欺骗性的 MySQL 查询

MySQL varchar timestamp 列存储两种不同的方式

php - Ajax删除功能不起作用

mysql - 获取一列中具有共同值的不同值列表

mysql - 将数据库结构导出为 "alter table"以便更新结构

MySQL/Eloquent 贪婪的正则表达式

php - MYSQL 获取最近的记录,然后在 where 子句中验证它的状态