我希望在插入过程中自动将自动增量包含在另一列中。例如,在ID是自动增量的表中,而Name是另一列,我想做类似的事情
`INSERT INTO Names (Name) VALUES (CONCAT("I am number ",ID));`
目前,我在没有Name的情况下执行INSERT,然后我必须立即使用$ mysqli-> insert_id进行更新。
我不想提前查询表格,因为在获得下一个自动增量值和插入之间可能会插入另一条记录。触发器可以工作,但似乎有点矫枉过正。我只是想知道我是否可以在插入中引用自动增量。
非常感谢!
答案 0 :(得分:1)
问题并不像看起来那么容易。在BEFORE INSERT
触发器中,尚未生成自动增量值(NEW.autoinc_column
为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_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。 它仍然确实需要对数据库进行两次高级写访问,但是所有操作都是连续进行的,不需要与客户端应用程序进行进一步的交互(实际上,从客户端应用程序发送了一条插入语句,然后进行隐式更新)。