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;
结束。