在 MySQL 中,如何在 INSERT 时使用另一列中的自动增量值?

Posted

技术标签:

【中文标题】在 MySQL 中,如何在 INSERT 时使用另一列中的自动增量值?【英文标题】:In MySQL, how can I use the autoincrement value in another column at the time of the INSERT? 【发布时间】:2013-06-20 10:14:22 【问题描述】:

我希望在插入期间将自动设置的自动增量包含在另一列中。例如,在 ID 是自动增量且名称是另一列的表中,我想做类似

`INSERT INTO Names (Name) VALUES (CONCAT("I am number ",ID));`

目前,我执行不带名称的 INSERT,然后我必须立即使用 $mysqli->insert_id 执行更新。

我不想提前查询表,因为在获得下一个自动增量值和插入之间可能会插入另一条记录。触发器可以工作,但似乎有点矫枉过正。我只想知道我是否可以在插入中引用自动增量。

非常感谢!

【问题讨论】:

我没试过,但是如果你只是在 INSERT 查询中按名称引用 id 字段,它不起作用吗? 你试过使用TRIGGER吗? JW,我已经阅读了有关如何使用 TRIGGER 进行操作的信息,它似乎有点“离 INSERT 很远”。如果我不能让它在 INSERT 中,我会保留UPDATE。安德鲁,我以为它是否会在自动增量之前或之后取值是模棱两可的,所以我刚才试了一下。也许我猜错了。我得到“我是 0 号”。自动增量数据的 to 设置没有发生。即使是这样,我仍然担心它在不同的 SQL 上的工作方式可能会有所不同。 【参考方案1】:

问题并不像看起来那么简单。在BEFORE INSERT 触发器中,尚未生成自动增量值(NEW.autoinc_column0),在AFTER INSERT 触发器中,无法再更改要插入的值。

使用 MyISAM 表,您可以检查下一个 AUTO_INCREMENT 值的表定义:

DELIMITER //    

    CREATE TRIGGER inserName BEFORE INSERT ON name FOR EACH ROW
    BEGIN
        DECLARE next_ai INT;
        SELECT auto_increment INTO next_ai
          FROM information_schema.tables
          WHERE table_schema = DATABASE() AND table_name = 'name';
        SET NEW.name = CONCAT("I am number ", next_ai);
    END //

DELIMITER ;

如果innodb_autoinc_lock_mode = 0(默认情况下并非如此),我相信这也适用于 InnoDB 表,但我不确定(因为可能存在并发问题)。

但如果 concat 的值始终相同,您可能最好使用如下视图:

CREATE VIEW names_v AS SELECT id, CONCAT("I am number ", id) AS name FROM names;

【讨论】:

YaK,感谢您的周到回复。我不想使用TRIGGER,因为它似乎像你描述的那样复杂。 (而且名称并不总是相同的;我只是想给出一个起始值。) 问题是我不认为这可以通过触发器以外的任何其他方式实现。或者也许有一些令人费解的东西:INSERT INTO names (name) VALUE (CONCAT('I am number ', SELECT auto_increment FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'name')); ;) name 并不总是相同的,但它是确定性的吗?视图定义也可以是 CREATE VIEW names_v AS SELECT id, someCustomFunction(id) AS name FROM names; :) 谢谢,YaK - 更好的词。不,名称并不总是确定性的(或公式化的)。我只是给出一个默认值。【参考方案2】:

我最近也遇到了这个问题,虽然它可能不是最好的解决方案,但我所做的对于你的情况来说可能是一个可行的选择。就我而言,这就足够了。您可以使用 AFTER INSERT 触发器来使用引用伪变量 NEW 的值更新字段。这可能会给你更多的灵活性。 我需要用一个字符串填充一个字段,该字符串是使用自动增量列中的值计算的。 触发器读取 NEW 伪变量,计算必要的值并执行 UPDATE。 它仍然需要对数据库进行两次高级写访问,但所有这些都是连续完成的,不需要与客户端应用程序进一步交互(实际上,从客户端应用程序发送一个插入语句,然后是隐式更新)。

【讨论】:

以上是关于在 MySQL 中,如何在 INSERT 时使用另一列中的自动增量值?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 插入数据如何防止重复

如何编写 MySQL 触发器以将行插入另一个表?

MySQL :LAST_INSERT_ID()函数总结

Mysql 在存储过程中使用 LAST_INSERT_ID

MYSQL 数据库基本操作

mySQL::insert into table,来自另一个表的数据?