我需要在插入时将auto_increment ID值复制到另一列中。 我想我需要一个“插入后”触发器,因为否则新ID不知道..?
我试过了:
IF NEW.content IS NULL THEN
SET NEW.content = NEW.id;
END IF
但它抱怨道:
触发后
不允许更新NEW行
答案 0 :(得分:2)
关于此代码
CREATE TRIGGER insert_example
BEFORE INSERT ON notes
FOR EACH ROW
SET NEW.content = (
SELECT AUTO_INCREMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'notes'
);
我做了类似这样的事情
SET NEW.content = (SELECT CONCAT('ID',LPAD(AUTO_INCREMENT, number,'0'))
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'notes');
如果你在id字段上使用UNSIGNED_ZEROFILL ......你可能需要一个自定义类型的" public" ID ...
答案 1 :(得分:0)
是的,触发器无法实现这一点。您可以做的最好的事情是用INSERT
替换CALL some_procedure(values...)
语句,并在其中实现上述逻辑。 (假设您可以在应用程序端更改SQL)。
设置EVENT的另一个(但更丑陋的)解决方案,定期修复您的记录,content=NULL
答案 2 :(得分:0)
正如OP指出的那样,NEW.id不能用于自动增量;可以使用以下触发器(使用风险自负)。试试这个。
CREATE TRIGGER insert_example
BEFORE INSERT ON notes
FOR EACH ROW
SET NEW.content = (
SELECT AUTO_INCREMENT
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'notes'
);
答案 3 :(得分:0)
有点躲闪,你能说出来吗
DELIMITER $$
CREATE TRIGGER sometrigger
AFTER INSERT ON sometable
BEGIN
UPDATE sometable SET content = NEW.id WHERE id = NEW.id;
END $$
通过完整查询更新(相同)表,而不是尝试使用SET。
甚至
DELIMITER $$
CREATE TRIGGER sometrigger
AFTER INSERT ON sometable
BEGIN
UPDATE sometable SET content = id WHERE content is null;
END $$
(这有点类似于Allita对事件的建议)
答案 4 :(得分:0)
如果您确实需要此行为出于某种原因,您可以通过使用单独的表进行排序和BEFORE INSERT
触发器来实现
首先,您需要一个简单的表来进行排序,可能看起来像
CREATE TABLE table1_seq
(
id int not null auto_increment primary key
);
然后您的事实表架构可能看起来像
CREATE TABLE table1
(
id int not null default 0 primary key,
content int
);
现在是触发器
DELIMITER $$
CREATE TRIGGER tg_ai_table1
BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
INSERT INTO table1_seq() VALUES();
SET NEW.id = LAST_INSERT_ID(), NEW.content = COALESCE(NEW.content, NEW.id);
END$$
DELIMITER ;
现在你插入table1
INSERT INTO table1 () VALUES (NULL),(-1);
你会有
| ID | CONTENT | |----|---------| | 1 | 1 | | 2 | -1 |
这是 SQLFiddle 演示