MySQL - 行更新时的触发错误

时间:2013-08-02 12:07:38

标签: mysql sql triggers

我正在尝试实现一个触发器来自动增加行更新上的字段。每次更新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是空的。如何将此值设置为正在更新的当前行的版本?

3 个答案:

答案 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