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

时间:2013-06-24 00:03:33

标签: mysql auto-increment sql-insert

我希望在插入过程中自动将自动增量包含在另一列中。例如,在ID是自动增量的表中,而Name是另一列,我想做类似的事情

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

目前,我在没有Name的情况下执行INSERT,然后我必须立即使用$ mysqli-> insert_id进行更新。

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

非常感谢!

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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