2016-09-07 66 views
1

MySQL的V 5.6mysql的觸發器:更新的列不屬於不爲空

您好,我有一個觸發前更新問題:桌子上,我有一個標誌defiend作爲TINYINT,不爲空,默認值1。我有一個更新之前的觸發器,只要該行更新,就將該標誌設置爲1。但是,我也需要一個過程的標誌明確設置爲0,所以我想,

create trigger t BEFORE UPDATE on table for each row 
BEGIN 
IF new.flag is NULL THEN 
    set new.flag = 1 
END IF; 

問題:new.flag永遠不能爲null。

IF new.flag is NULL THEN 
    set new.flag = 1 
ELSEIF new.flag = 0 THEN 
    set new.flag = 3 
END IF; 

檢查列設置爲3時,我不包含在更新查詢標誌更新表。更糟的是,我無法對證空字符串把標誌1,作爲選擇(「」 = 0)返回true,如果使用:

IF new.flag is NULL OR new.flag = '' THEN 
    set new.flag = 1 
END IF; 

我旗從來沒有明確設置爲0。 NEW中沒有列的更新不應爲null?我能做什麼,它是一個MySQL配置改變?

感謝

+2

'new'將包含行更新後的值(以及之前的'old'值)。如果你沒有在你的查詢中設置它,它會有它以前的值('new'不是你在更新查詢中使用的列的列表)。您可以使用例如在你的更新查詢中設置flag = 3作爲你想在觸發器中設置爲0的標記。或者你可能想要改變你的邏輯,普通的更新標記是例如帶'on update current_timestamp'的'timestamp'字段。 – Solarflare

+0

@Solarflare ha,設置一個假值,然後在rigger中設置爲0似乎是這樣做的:IF new.flag_indexation_required = 3 THEN set new。flag_indexation_required = 0; ELSE set new.flag_indexation_required = 1; END IF;你可以添加你的答案,所以我可以接受它嗎? – jlb

回答

1

NEW包含該行將會有更新後,不只是你在更新查詢明確使用了值的所有列的值。爲了告訴觸發器你想要顯式地重置值,你可以使用一個不用的(但是有效的)值來標記該信息,然後在觸發器中相應地進行操作,例如在你的觸發器中,使用(假設簽約TINYINT)

IF new.flag = -1 THEN 
    set new.flag = 0; 
ELSE 
    set new.flag = 1; 
END IF; 

然後在你update查詢,

update table set flag = -1; 

將其值設置爲0,其他任何值,或者不使用在查詢該列所有,將其設置爲1

有沒有觸發器的替代和更常見的方法,其作用類似於你的國旗。您可以使用列

last_update datetime default null on update current_timestamp; 

null在此列將具有相同的含義flag = 0,任何其他值將具有相同的含義flag = 1。它們被自動設置。如果你想重置你的「旗幟」,你可以簡單地使用

update table set last_update = null; 

你的觸發器方法當然會工作太完美。只要確保在某處記錄該行爲。