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

Saa*_*aad 6 mysql

我的表有两列:"id"(自动增量,主要)和"数字"(唯一).现在我想要以下内容:

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

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

注意:

  • 这个数字更有可能是新的;
  • 该表将包含数十万条记录.

谢谢!

Chr*_*ris 6

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

SELECT id FROM table WHERE number = 42;
Run Code Online (Sandbox Code Playgroud)

这可能是MySQL中最有效的.您可以使用存储过程将它们混淆,这可能会或可能不会更高效.

编辑:

如果您认为新数字出现的情况很少见,那么速度会更快:

SELECT id FROM table WHERE number = 42;

if (!id) {

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

}
Run Code Online (Sandbox Code Playgroud)

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