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

时间:2010-12-17 23:49:14

标签: mysql

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

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

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

注意:

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

谢谢!

3 个答案:

答案 0 :(得分:6)

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;

}

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

答案 1 :(得分:4)

这是一个这样存储的函数,可以执行您所描述的内容:

CREATE FUNCTION `spNextNumber`(pNumber int) RETURNS int(11)
BEGIN
DECLARE returnValue int;
SET returnValue := (SELECT Number FROM Tbl WHERE Number = pNumber LIMIT 1);
IF returnValue IS NULL THEN
    INSERT IGNORE INTO Tbl (Number) VALUES (pNumber);
    SET returnValue := pNumber; -- LAST_INSERT_ID() can give you the real, surrogate key
END IF;
RETURN returnValue;
END

答案 2 :(得分:1)

我知道这是旧的,但这是一个常见的问题。因此,为了寻找解决方案的任何人,有4种不同的方法可以通过性能基准来完成这项任务。 http://mikefenwick.com/blog/insert-into-database-or-return-id-of-duplicate-row-in-mysql/