【问题标题】:INSERT and return ID, or if DUPLICATE KEY return existing ID in MySQLINSERT 并返回 ID,或者如果 DUPLICATE KEY 返回 MySQL 中的现有 ID
【发布时间】:2013-04-28 18:59:06
【问题描述】:

我有一个“标签”表,它在“标签”列上有一个 UNIQUE,以防止重复。

我有一个“bookmarks_tags”表,它将书签与标签相关联,并且它在“bookmark_id”和“tag_id”列上有一个唯一的,以防止重复。

但是,我需要人们能够添加相同的标签,为此,我需要一些方法来检索现有标签的 ID,以在“bookmarks_tags”表中用作参考。

有没有办法编写 INSERT 以便在检测到重复项时返回该重复项的 ID?或者,INSERT ... SELECT 是否更适合“bookmarks_tags”表?

这里的关键是它必须在两种情况下都可以工作;添加为新的,或检索旧的。

此外,LAST_INSERT_ID() 在这种情况下是没有用的,因为有问题的标签可以随时添加。

有什么想法吗?

【问题讨论】:

  • this 会帮助你
  • 我可以编写一个 SELECT 查询,但这不是问题。我需要知道一个 INSERT 是否可以完成同样的事情,从而节省额外的编码;我正在使用一个框架,所以有几个文件需要更改。

标签: mysql


【解决方案1】:
$query = "INSERT INTO table SET unique1=value1 AND unique2=value2… ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id)";
$insert_result = mysql_query($query);
$id = mysql_insert_id();
return $id;

Insert Into Database or Return ID of Duplicate Row in MySQL(备份链接@WebArchive

【讨论】:

  • 有没有办法区分新的和重复的返回id?
  • 链接断开。 :(
  • @JaredDunham 备份链接已添加 ;-)
  • 请注意这将导致自动增量增加
【解决方案2】:

一种方法是使用INSERT IGNORE

INSERT IGNORE INTO tags (tags,...) VALUES (the_new_tags, ...);

SELECT tag_id FROM tags WHERE tags=the_new_tags;

【讨论】:

  • 好的,这就是我要去的方式。这是最麻烦的一个。罗斯,谢谢。
  • @Pham Duc Quang 方法不是更好吗?只需要一个查询。
  • 是的,INSERT INTO tags SET tags=the_new_tags ON DUPLICATE KEY UPDATE tag_id=LAST_INSERT_ID(tag_id) 应该会更好,但我还没有测试过。
  • Insert IGNORE 是一个坏主意,因为它会忽略所有错误(类型、长度等),而是INSERT ON DUPLICATE KEY UPDATE key=key,但会正确抛出其他错误。 dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html查看其他答案:stackoverflow.com/a/16796885/3343553
猜你喜欢
  • 2014-12-14
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-20
  • 2014-04-28
  • 1970-01-01
相关资源
最近更新 更多