mysql:如果不存在则插入记录,否则返回记录的id

Abu*_*usi 21 mysql sql sql-insert

我需要在表中插入唯一值,并且需要记录的id,需要在关系表中插入那些id,如果不存在则需要查询插入记录返回inset id,如果存在则返回记录主键(id ).

我想为多个值做这个,比如橙色,芒果,香蕉,就像批量插入一样.

模式:

------------
id | tag   |
------------
1  | orange|
------------
Run Code Online (Sandbox Code Playgroud)

我把这个记录为一个记录

INSERT INTO `tags` (`tag`) 
SELECT 'myvalue1' 
FROM tags
WHERE NOT EXISTS (SELECT 1 FROM `tags` WHERE `tag`='myvalue1') 
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

发布问题以找出一些优化的解决方案,我不想在代码中使用额外的循环来匹配db的值.

Mar*_*ams 13

文档页面上有一个示例INSERT ... ON DUPLICATE KEY UPDATE:

您的查询将如下所示:

INSERT INTO `tags` (`tag`) VALUES ('myvalue1')
  ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), `tag`='myvalue1';
SELECT LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的问题在于,当它实际执行插入时(至少对于 MySQL8.0 / InnoDB),它可能会导致 id 发生相当大的变化。例如,作为一个测试用例 - 我制作了一个包含 4 行 ID 和电子邮件的小表。我将此示例与我插入的第二封 (id=2) 电子邮件一起使用,并且它按照您的描述工作。然而,当我插入一个新的电子邮件地址时,我最终得到了 5 行,id 分别为 1、2、3、4 和 7。 (2认同)