2012-02-20 96 views
9

例如:在sqlite中插入觸發器之前,我可以更新嗎?

create table test (id numeric, t date not null); 

create trigger test_in 
before insert on test 
for each row 
when New.t is null 
begin 
-- set New.t = now(); 
end; 

集New.t沒有工作,where can be only select/insert/update/delete stmt. 我不能更改數據庫結構(可以設置默認值)。 由於「非空」限制,插入觸發器也不適合。 我發現的唯一的解決辦法:用於說明目的

insert into test values (New.id, now()); 
select raise(ignore); 

測試數據庫而已,在實踐中也有更復雜的情況下計算得到的數據。有可能是這樣的「更新新集New.t =現在()」,或不?

+0

你可以創建一個視圖與INSTEAD OF觸發器,並插入到視圖? – 2012-02-20 06:42:02

+0

這也是一個決定的變體,但不能解決問題。在我的情況下,表是在同步過程中創建的。之後我可以運行任何ddl。 – lunicon 2012-02-20 07:08:34

+0

在主數據庫模型中也使用set stmt觸發器。我可以創建視圖,但必須更改和編程(如果我可以...) – lunicon 2012-02-20 07:16:51

回答

6

不,你不能更新新的。

我傾向於做的是使用一個視圖與INSTEAD OF觸發器作爲畝短評論。

在您的情況最好的解決辦法可能是使用AFTER INSERT/UPDATE觸發器時NEW.t爲null,則受影響的行(S)在更新T:

CREATE TRIGGER test_in 
AFTER INSERT ON test 
FOR EACH ROW 
WHEN (NEW.t IS NULL) 
BEGIN 
    UPDATE test SET t = now() WHERE id = NEW.id; 
END; 

僅供參考,您的id列應可能被宣佈爲INTEGER PRIMARY KEY ...

+0

我不適合,因爲「非空」約束這個選項 - 將失敗,空:(PS,不應該混淆新人,更好地利用更新...其中的ROWID = new.rowid – lunicon 2012-03-02 22:04:59

+0

好吧,既然你有這樣的觸發t不會是NULL,所以你可以放棄這個約束,至於rowid ...我暗示了這一點,但你說得對,新手可能不會得到提示。另一方面,並​​不是所有的RDBMS總是有rowid ..是的,SQLite3基本上總是有一個rowid,_but_你可以有名爲'rowid'的列不是INTEGER PRIMARY KEY,所以我覺得建議你有一個明確的INTEGER PRIMARY KEY會更安全。 – Nico 2012-03-05 23:15:52