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的主要内容,如果未能解决你的问题,请参考以下文章