1. 程式人生 > >SQLite的一個觸發器的例子

SQLite的一個觸發器的例子

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;

結束。