我的表有两列:“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/