【问题标题】:How to insert the value derived from AUTO_INCREMENT into another column in the same INSERT query?如何将派生自 AUTO_INCREMENT 的值插入同一 INSERT 查询中的另一列?
【发布时间】:2010-11-26 01:28:45
【问题描述】:

我有一个 id 列,它是具有 AUTO_INCREMENT 的主键。我需要将生成的值插入到 id 列以及另一列(未设置为 AUTO_INCREMENT,并且不是唯一的。

目前我使用 mysqld_isnert_id() 函数来获取 id,并在插入后简单地运行更新查询,但我想知道是否可以在不运行第二次更新查询的情况下执行此操作。

【问题讨论】:

  • 我自己尝试过一次,但没有找到解决方案。无论如何,祝你好运!

标签: mysql


【解决方案1】:

插入触发器后?

【讨论】:

  • 这仍然是两个查询,只是被混淆了。
  • 适当注明,但必须插入行才能使其成为生成的 id。所以,看起来我们需要两步而不是一步。
  • 不真实,你可以得到下一个id,只是知道它住在哪里。
【解决方案2】:

如果我没记错的话,在执行插入之前甚至不会创建自动生成的 ID。您的两种查询方式可能是唯一无需深入了解存储过程的方式。

【讨论】:

    【解决方案3】:

    您可以按照以下方式定义触发器:

    delimiter //
    CREATE TRIGGER upd_check AFTER INSERT ON mainTable
    FOR EACH ROW
    BEGIN
      UPDATE dependingTable 
      SET dependingTable.column = NEW.id
    END;//
    delimiter ;
    

    我不确定何时生成 AUTO_INCREMENT 值,但您可以尝试以下操作,因为如果它有效,它将为您节省更新(如果您希望将值复制到的列与插入行):

    CREATE TRIGGER upd_check BEFORE INSERT ON mainTable
    FOR EACH ROW 
    SET NEW.column = NEW.id
    

    【讨论】:

      【解决方案4】:

      我可以看到您使用单个查询执行此操作的唯一方法是使用信息架构。在信息模式中有一个名为“tables”的表,您可以在其中访问 auto_increment 列。它包含该表的 NEXT 插入 ID,您可以通过嵌套选择访问它,只需授予用于连接到数据库的用户对该表的读取访问权限。据我所知,这仅适用于 innodb 引擎,因为您为填充第二个 id 字段所做的嵌套选择将成为插入的更大事务的一部分。

      这就是您的查询可能的样子:

      INSERT INTO fooTable VALUES (0, (SELECT AUTO_INCREMENT FROM information_schema.TABLES));
      

      此外,如果您担心读取访问权限和安全问题,请记住这与您可以通过运行显示表状态获得的信息相同。说到这一点,我试着看看你是否可以通过 select 投射显示命令/查询,但你不能,这完全糟透了,因为那将是一个更清洁的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-21
        • 2020-09-03
        • 1970-01-01
        • 2015-01-18
        • 1970-01-01
        • 2014-08-05
        • 1970-01-01
        相关资源
        最近更新 更多