2013-08-02 65 views
1

我想实现一个触发器来自动增加行更新字段。每次更新PERSON表中的现有行时,我都希望consistency_version自动增加1。MySQL - 行更新触发错误

我的表:

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 

当我在我所期望的consistency_version一个

但我递增表中的行执行UPDATE语句得到以下错误:

Column "consistency_version" cannot be null 

任何人都可以建议我做错了什么?我认为@VERSION是空的。我怎样才能将此值设置为正在更新的当前行的版本?

回答

1

我最好的猜测是,“@version”将返回NULL。这会导致@version + 1导致null,然后尝试将不可为空的consistency_version列设置为null,从而导致错误。

您是否尝试过使用OLD?

CREATE TRIGGER consistency_version_trigger BEFORE UPDATE ON PERSON
FOR EACH ROW SET NEW.VERSION = OLD.VERSION+1

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避免在事务中锁定很长时间也很重要。

+0

感谢您的答复,但我需要保持全球每行和版本没有。我正在检查手册,我相信OLD.VERSION的作品,而不是使用变量。 – Santiago

+0

是的,在这种情况下,OLD.VERSION将起作用。 – Vatev

0

如果我正确理解您的需求,下面将解决你的问题

CREATE TRIGGER `TgrNAME` BEFORE UPDATE ON `PERSON` 
    FOR EACH ROW BEGIN 
    set new.consistency_version = new.consistency_version +1 ; 
END