【问题标题】:How do I get the ID of multiple inserted rows in MySQL?如何在 MySQL 中获取多个插入行的 ID?
【发布时间】:2011-11-22 00:31:14
【问题描述】:

我正在使用这个命令将一些单词插入到一个包含两列的表格中:

INSERT IGNORE INTO terms (term) VALUES ('word1'), ('word2'), ('word3');
  1. 如何获取插入每个单词的行的 ID(主键)。我的意思是在执行INSERT 之后返回一个类似“55,56,57”的值。 MySQL有这样的反应吗?

  2. 术语列是UNIQUE。如果一个术语已经存在,MySQL 将不会插入它。是否可以返回此重复的引用(即存在该术语的行的 ID)?类似“55,12,56”的响应。

【问题讨论】:

    标签: mysql sql database insert normalization


    【解决方案1】:
    1. 您可以通过SELECT LAST_INSERT_ID(); 或通过让您的框架/MySQL 库(以任何语言)调用mysql_insert_id() 来获得它。

    2. 那行不通。插入后必须在此处查询 ID。

    【讨论】:

    • 正确 - 不与 INSERT IGNORE 合二为一。但是在非IGNORE 中,它会为您提供生成和插入的第一个值。
    • 如果另一个用户同时进行了另一个插入怎么办?
    • @Pitto 不过你会从LAST_INSERT_ID() 得到正确的值。 mysql_insert_id()。前者知道当前会话中最后发生了什么,后者直接绑定到最后一个查询。如果在不同的连接中发生了其他事情,那也没有什么坏处。
    【解决方案2】:

    为什么不只是:

    SELECT ID
      FROM terms
     WHERE term IN ('word1', 'word2', 'word3')
    

    【讨论】:

    • 这会获取之前插入的术语,并且容易受到竞争条件的影响,即在选择查询触发之前其他东西插入记录。
    • ?? term 有一个 UNIQUE 条件。唯一可能在竞争条件下影响 SELECT 的是 DELETE,而不是另一个 INSERT。根据 OP 帖子中的 (2),他们希望包含先前插入的记录的 ID。
    • 这就是我的想法;但它需要几行编码。除了 SELECT,我需要获取结果并在 while 循环中获取它们(在我使用的 php 中)。我希望能找到某种 mysql 响应。
    • @Googlebot 这是最好的方法。如果您想遍历 ID,只需执行 SELECT (显示在此答案中)并遍历结果。 再多几行代码是什么? 如果您真的希望 MySQL 回显 ID,您必须发出单独的单个 INSERT 语句并在每个 INSERT 之后执行 SELECT LAST_INSERT_ID() 以收集将 ID 放入数组中。
    【解决方案3】:

    首先,要获取刚刚插入的 id,您可以执行以下操作:

    SELECT LAST_INSERT_ID() ;
    

    注意,这仅在您最后一次 INSERT 查询之后有效,并且如果您有多次插入,它将返回仅第一个 ID

    然后,使用IGNORE 选项,我认为不可能获取未插入的行。当您创建INSERT IGNORE 时,您只需告诉 MySQL 忽略必须创建重复条目的行。

    如果您不设置此选项,INSERT 将被停止,您将获得与复制有关的行。

    【讨论】:

    • 即使没有 IGNORE,它也只适用于单行 INSERT。我的命令是多行 INSERT
    • 我的答案只有第一部分包括 IGNORE。
    • 如果您使用的是 PHP,您可以使用循环将 ID 存储在表中,每个段落中都有一个 INSERT。
    猜你喜欢
    • 2020-07-15
    • 2016-02-20
    • 1970-01-01
    • 2019-11-21
    • 2017-10-14
    • 2016-03-20
    • 2011-07-24
    • 2017-10-22
    • 1970-01-01
    相关资源
    最近更新 更多