我的表有两列:“id”(自动增量,主要)和“数字”(唯一)。现在我想要以下内容:
这项工作最有效的方法是什么?
注意:
谢谢!
答案 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/。