Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-如果存在,获取主键。否则,添加条目_Mysql - Fatal编程技术网

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

MySQL-如果存在,获取主键。否则,添加条目,mysql,Mysql,我的表有两列:id自动递增、主列和唯一列。现在我想谈谈以下几点: 如果号码已经存在,返回id; 否则,将条目添加到表中并返回其id。 做这项工作最有效的方法是什么 注: 这个数字是新的可能性更大; 该表将包含数十万条记录。 谢谢大家! INSERT IGNORE INTO table (number) VALUES (42); SELECT id FROM table WHERE number = 42; 这可能是MySQL中效率最高的。您可以使用存储过程将它们组合起来,这可能会更高效,也可

我的表有两列:id自动递增、主列和唯一列。现在我想谈谈以下几点:

如果号码已经存在,返回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;

}

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

这里有一个这样的存储函数,它执行您所描述的操作:

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

我知道这很古老,但这是一个常见的问题。因此,为了寻找解决方案的人,这里有4种不同的方法可以通过性能基准完成这项任务

我能想到的最好的方法是使用存储过程,我现在不能提供一个示例,但看看它是如何使用的:将IGNORE插入到People Number value pNumber中;设置返回值:=从人员中选择编号,其中编号=P编号限制1;我想这样会更有效率?这取决于复制的频率,正如Chris在上面提到的。。。。尝试不必要的插入并使用IGNORE捕获可能比选择限制1的成本更高。然而,对于他关于比赛条件的观点,我在这个答案的插入部分添加了一个忽略。谢谢塔巴扎的帮助!我已经修改了我的问题并添加了更多的细节,请您确认您的解决方案是否仍然是最好的,或者您愿意修改吗?我已经更新了我的问题。表中会有数十万条记录,获得新数字的可能性更大。一个存储过程会为这么多的记录创建多大的差异?在这种情况下,我会先进行插入,然后进行选择,这样更简单,并且没有竞争条件。假设您的数据库服务器靠近web服务器,则存储过程不会有什么不同。您可以通过编写两个代码路径,然后对它们进行压力测试来轻松测试。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接供参考。如果链接页面发生更改,则仅链接的答案可能无效。