4

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

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

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

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

非常感谢!

4

2 回答 2

3

问题并不像看起来那么容易。在BEFORE INSERT触发器中,尚未生成自动增量值(NEW.autoinc_columnis 0),并且在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 表一起使用innodb_autoinc_lock_mode = 0(默认情况下并非如此),但我不确定(因为可能存在并发问题)。

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

CREATE VIEW names_v AS SELECT id, CONCAT("I am number ", id) AS name FROM names;
于 2013-06-24T00:34:09.220 回答
0

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

于 2019-09-12T21:00:07.927 回答