SQLite的一個觸發器的例子
阿新 • • 發佈:2019-02-11
sqlite3觸發器的實戰
你可以搜尋“sqlite 觸發器”或“SQLite 觸發器的SQL語法”,然後你應該能找到一個PDF文件或其他樣式的檔案。它簡要講解了一些基本內容,如果你和我一樣什麼都不知道,可以先看一下它。
觸發器分為“語句級觸發器”和“行級觸發器”。
語句級觸發器是指每執行一條DML語句,該觸發器就執行一次。
行級觸發器是指每個DML操作影響幾條記錄,就會觸發幾次(FOR EACH ROW),
行級觸發器中由於涉及到了每條記錄的資料變動,所以對於每條記錄的資料來說就有新值和舊值之分。
At this time SQLite supports only FOR EACH ROW triggers, not FOR EACH STATEMENT triggers.
此時,SQLite僅支援FOR EACH ROW觸發器,而不支援FOR EACH STATEMENT觸發器。
SQLite的TRIGGER的語法圖:
http://sqlite.org/lang_createtrigger.html
從SQLite的TRIGGER的語法圖裡面可以看到,語法圖裡面並沒有IF-ELSE語句,SQLite的TRIGGER貌似不支援IF-ELSE語句,好像也不支援CASE-WHEN-THEN-ELSE語句。
SQLite的TRIGGER貌似也不支援定義變數。不過,可以將臨時值插入一個臨時表(key,value)中,模擬出來變數進行使用。
開始:
--建立key_value表。 CREATE TABLE key_value( key varchar(32) NOT NULL PRIMARY KEY, value varchar(32) ); --建立log_info表。 CREATE TABLE log_info( idx INTEGER PRIMARY KEY, --A column declared INTEGER PRIMARY KEY will autoincrement. dttm TIMESTAMP NOT NULL DEFAULT (DATETIME('now','localtime')), info TEXT ); --SQLite的觸發器的語法圖裡面沒有IF-ELSE語句。同時有WHEN語句。 --其中的WHEN操作符表示了執行該觸發器的條件,彌補了SQLite沒有IF-ELSE這樣邏輯分析語句的缺陷。 --注:SQLite中,連線字串不是使用+,而是使用||。 --建立t_key_value_insert觸發器。向key_value表insert資料時,觸發器被呼叫。 CREATE TRIGGER t_key_value_insert AFTER INSERT ON key_value FOR EACH ROW WHEN new.key='yyyymmdd' BEGIN INSERT INTO log_info(info) VALUES('[AFTER_INSERT]['||new.key||']['||new.value||']'); END; --建立t_key_value_update觸發器。向key_value表update資料時,觸發器被呼叫。 CREATE TRIGGER t_key_value_update AFTER UPDATE ON key_value FOR EACH ROW WHEN new.key='yyyymmdd' BEGIN INSERT INTO log_info(info) VALUES('[AFTER_UPDATE]['||new.key||']['||new.value||']'); END; --向key_value表中新增資料,利用log_info表來觀察觸發器的反應。 REPLACE INTO key_value(key,value)VALUES('yyyymmdd','20160101'); REPLACE INTO key_value(key,value)VALUES('yyyymmdd','20160202'); REPLACE INTO key_value(key,value)VALUES('temp_key','temp_value'); UPDATE key_value SET value='20160303' WHERE key='yyyymmdd'; select * from log_info;
結束。