2013-08-02 46 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