我正在尝试实现一个触发器来自动增加行更新上的字段。每次更新PERSON表中的现有行时,我都希望consistency_version自动递增1。
我的表:
CREATE TABLE PERSON (
id INT NOT NULL AUTO_INCREMENT,
consistency_version INT NOT NULL DEFAULT 0,
name CHAR (100) NOT NULL,
);
和触发器:
CREATE TRIGGER consistency_version_trigger BEFORE UPDATE ON PERSON
FOR EACH ROW SET NEW.VERSION = @VERSION+1
当我对表中的一行执行update语句时,我希望consistency_version增加一个
但我收到以下错误:
Column "consistency_version" cannot be null
任何人都可以告诉我做错了什么?我认为@VERSION是空的。如何将此值设置为正在更新的当前行的版本?
答案 0 :(得分:1)
@VERSION是一个会话变量。它存在并且仅在创建它的会话期间可见。所以你基本上说SET NEW.VERSION = NULL + 1
是NULL。
假设内置自动增量功能因某些原因不符合您的需求:
要创建全局自动递增值,您需要使用表格。 创建一个这样的表:
CREATE TABLE `consistency_version` (
`consistency_version` INT(10) UNSIGNED NOT NULL
) ENGINE=MyISAM;
INSERT INTO `consistency_version` VALUES(1);
然后得到下一个这样的数字:
UPDATE consistency_version SET consistency_version = LAST_INSERT_ID(consistency_version +1);
SET NEW.VERSION = LAST_INSERT_ID();
这使用LAST_INSERT_ID作为保留下一个号码的临时位置。您可以在the manual中获得有关此内容的更多信息。
序列表是MyISAM以避免在事务期间长时间锁定它也很重要。
答案 1 :(得分:1)
我最好的猜测是'@version'返回NULL。这会导致@version + 1导致null,然后尝试将not-nullable consistency_version列设置为null,从而导致错误。
您是否尝试过使用OLD?
CREATE TRIGGER consistency_version_trigger BEFORE UPDATE ON PERSON
FOR EACH ROW SET NEW.VERSION = OLD.VERSION+1
答案 2 :(得分:0)
如果我理解您的要求,以下将解决您的问题
CREATE TRIGGER `TgrNAME` BEFORE UPDATE ON `PERSON`
FOR EACH ROW BEGIN
set new.consistency_version = new.consistency_version +1 ;
END