SQLite的一個觸發器的例子

sqlite3觸發器的實戰

http://blog.afantree.com/sql/sqlite3-trigger-demo.html

你可以搜索“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;

結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章