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

Posted

技术标签:

【中文标题】mysql:如果不存在则插入记录,否则返回记录的ID【英文标题】:mysql: insert record if not exists else return the id of record 【发布时间】:2013-12-27 02:44:20 【问题描述】:

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

我想为多个值执行此操作,例如橙色、芒果、香蕉,例如批量插入。

架构:

------------
id | tag   |
------------
1  | orange|
------------

我已经为一条记录尝试过这个

INSERT INTO `tags` (`tag`) 
SELECT 'myvalue1' 
FROM tags
WHERE NOT EXISTS (SELECT 1 FROM `tags` WHERE `tag`='myvalue1') 
LIMIT 1

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

【问题讨论】:

请学会使用问题编辑器中的代码格式按钮 谢谢,我会负责格式化 mysql 确实有更新或插入到 'tag' 语句 可能应该只编写一个存储过程,在这种情况下首先进行选择。注意:获取已经存在的 ID 很容易。获取使用ON DUPLICATE KEY UPDATE 后创建的新记录的 ID 有点像噩梦。 【参考方案1】:

如果不存在,这里是要插入的 mysql 状态,并返回新插入或旧的 id

    INSERT INTO `tags` (`tag`) 
SELECT 'myvalue1' 
FROM tags
WHERE NOT EXISTS (SELECT id FROM `tags` WHERE `tag`='myvalue1') 
LIMIT 1;
select * from brand where `tag`='myvalue1'

【讨论】:

这个实际上比马库斯·亚当斯(Marcus Adams)提出的那个好得多(没有冒犯的人)。这不会错开自动增量值并跳过内容。【参考方案2】:

以下链接中列出了4种方法,请查看并使用适合您的方法。

方法 1:选择,然后插入 方法 2:尝试 INSERT 捕捉 SELECT 方法 3:INSERT IGNORE 然后 SELECT 方法 4:INSERT INTO... ON DUPLICATE KEY UPDATE

http://mikefenwick.com/blog/insert-into-database-or-return-id-of-duplicate-row-in-mysql/

【讨论】:

链接失效。 404 404 404 看起来网络存档有文章的快照。 web.archive.org/web/20140110034752/http://mikefenwick.com/blog/…【参考方案3】:

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();

【讨论】:

这种方法的问题在于,当它实际执行插入时(至少在 MySQL8.0 / InnoDB 中),它会导致 id 发生相当大的变化。例如,作为一个测试用例 - 我制作了一个包含 4 行 id 和 email 的小表。我将此示例与我插入的第二个 (id=2) 电子邮件一起使用,它按照您的描述工作。但是,当我插入一个新的电子邮件地址时,我最终得到了 5 行 id 分别为 1、2、3、4 和 7 的行。 @CreationTribe,我不知道您所说的“插入新的电子邮件地址”是什么意思。也许您可以在单独的问题中提供更多信息。要记住的一个警告是ON DUPLICATE KEY... 需要在插入的列上使用唯一键才能触发重复。

以上是关于mysql:如果不存在则插入记录,否则返回记录的ID的主要内容,如果未能解决你的问题,请参考以下文章

如果已存在则更新行,否则使用 mysql 在表中插入新记录

如果记录存在则插入和更新,否则不存在竞争条件

如果 id 存在则更新,否则插入 (ODBC)

mysql判断一条记录是否存在,如果存在,则更新此语句,如果不存在,则插入

如果不存在则插入记录的MySQL条件[重复]

如果不存在则插入,否则在 Netezza 中更新