SQLITE触发器

来源:互联网 发布:淘宝如何变更主营类目 编辑:程序博客网 时间:2024/06/05 22:56

SQLite 触发器的 SQL 语法
CREATE TRIGGER
sql-statement ::=
CREATE [TEMP | TEMPORARY] TRIGGER trigger-name
[ BEFORE | AFTER ]
database-event ON
[database-name .] table-name
trigger-action
sql-statement ::=
CREATE [TEMP | TEMPORARY] TRIGGER trigger-name
INSTEAD OF
database-event ON
[database-name .] view-name
trigger-action
database-event ::=
DELETE |
INSERT |
UPDATE |
UPDATE OF column-list
trigger-action ::= [ FOR EACH ROW
| FOR EACH STATEMENT ] [ WHEN
expression ]
BEGIN
trigger-step ; [ trigger-step ; ]*
END
trigger-step ::=
update-statement
| insert-statement |
delete-statement
| select-statement
CREATE TRIGGER 语句用于向数据库 schema 中添加触发器。触发器是一些在特定
的数据库事件(database-event) 发生时自动进行的数据库操作
(trigger-action).
触发器可由在特殊表上执行的 DELETE, INSERT, UPDATE 等语句触发,或 UPDATE
表中特定的字段时触发。
现在 SQLite 仅支持 FOR EACH ROW 触发器,不支持 FOR EACH STATEMENT 触发。
因此可以不用明确说明 FOR EACH ROW .FOR EACH ROW 的意思是由 trigger-steps
说明的 SQL 语句可能在(由 WHEN 子句决定的)数据库插入, 更改或删除的每一行
触发 trigger.
WHEN 子句和 trigger-steps 可以使用”NEW.column-name”和”OLD.column-name”
的引用形式访问正在被插入,更改或 删除的行的元素, column-name 是触发器
关联的表中的字段名。OLD 和 NEW 引用只在触发器与之相关的 trigger-event
处可用,例如:
INSERT NEW 可用
UPDATE NEW 和 OLD 均可用
DELETE OLD 可用
当使用 WHEN 子句, trigger-steps 只在 WHEN 子句为真的行执行。不使用 WHEN
时则在所有行执行。
trigger-time 决定了 trigger-steps 执行的时间,它是相对于关联行的插入,
删除和修改而言的。
作为的一部分 trigger-step 的 UPDATE 或 INSERT 可以使用 ON CONFLICT 子句。
但若触发 trigger 的语句使用了 ON CONFLICT 子句,则覆盖前述的 ON CONFLICT
子句所定义的冲突处理方法。
关联表被撤销时触发器被自动删除。
不仅在表上,在视图上一样可以创建触发器,在 CREATE TRIGGER 语句中使用
INSTEAD OF 即可。 若视图上定义了一个或多个 ON INSERT, ON DELETE, ON UPDATE
触发器,则相应地对视图执行 INSERT,DELETE 或 UPDATE 语句 不会出错,而会
触发关联的触发器。视图关联的表不会被修改。(除了由触发器进行的修改操作)。
Example:
假设”customers”表存储了客户信息,”orders”表存储了订单信息,下面的触发
器确保当用户改变地址时所有的 关联订单地址均进行相应改变:
CREATE TRIGGER update_customer_address UPDATE OF address ON customers
BEGIN
UPDATE orders SET address = new.address WHERE customer_name =
old.name;
END;
定义了该触发器后执行如下语句:
UPDATE customers SET address = ’1 Main St.’ WHERE name = ’Jack Jones’;
会使下面的语句自动执行:
UPDATE orders SET address = ’1 Main St.’ WHERE customer_name = ’Jack
Jones’;
注意,目前在有 INTEGER PRIMARY KEY 域的表上触发器可能工作不正常。若 BEFORE
触发器修改了一行的 INTEGER PRIMARY KEY 域,而该域将由触发该触发器的语
句进行修改,则可能根本不会修改该域。 可以用 PRIMARY KEY 字段代替 INTEGER
PRIMARY KEY 字段来解决上述问题。
一个特殊的 SQL 函数 RAISE()可用于触发器程序,使用如下语法:
raise-function ::=
RAISE ( ABORT, error-message ) |
RAISE ( FAIL, error-message ) |
RAISE ( ROLLBACK, error-message ) |
RAISE ( IGNORE )
当触发器程序执行中调用了上述前三个之一的形式时,则执行指定的 ON
CONFLICT 进程(ABORT, FAIL 或者 ROLLBACK) 且终止当前查询,返回一个
SQLITE_CONSTRAINT 错误并说明错误信息。
当调用 RAISE(IGNORE),当前触发器程序的余下部分,触发该触发器的语句和任
何之后的触发器程序被忽略并且 不恢复对数据库的已有改变。 若触发触发器的
语句是一个触发器程序本身的一部分,则原触发器程序从下一步起继续执行。
使用 DROP TRIGGER 删除触发器。

sqlite 触发器 详解 demo (2012-05-29 15:55:58)转载▼
标签: air sqlite as3 杂谈
今天 做工具的时候 碰到了这个问题 ,sqlite 是支持触发器的 ,但是并不是全部支持,我在网上搜了一下,还是有一些朋友比较细心,做了总结,我直接拿来主义了啊 ,哈哈,博客原地址
http://blog.csdn.net/lzq_it/article/details/6960176
–创建班级表
create table class
(
id integer primary key autoincrement, –班级编号
className nvarchar(50) –班级名称
);

–创建学生表
create table student
(
id integer primary key autoincrement, –编号
stuName nvarchar(20), –学生名称
stuSex bit, –性别
stuAge integer , –年龄
classId –班级编号
);

–创建插入触发器 (创建学生时要触发插入触发器去判断是否存在该班级,存在插入成功,反之插入失败)
create trigger fk_Insert
before insert on student
for each row
begin
select raise(rollback,’还没有该班级’)
where (select id from class where id = new.classId ) is null;
end;

–创建更新触发器 (更新学生时要触发更新触发器去判断是否存在更新班级,存在更新成功,反之更新失败)
create trigger fk_Update
before update on student
for each row
begin
select raise(rollback,’还没有该班级’)
where (select id from class where id = new.classId)is null;
end;

–创建删除触发器 (删除班级时,首先根据班级编号删除该班级学生)
create trigger fk_Delete
before delete on class
for each row
begin
delete from student where classId = old.classId;
end ;

insert into class(className) values(‘s1t64’);

insert into student(stuName,stuSex,stuAge,classId)values(‘zhangsan’,1,23,1);

update student set stuName=’lishi’,classId=1 where id = 1;

select * from class ;
select * from student limit 0,100 ; – 分页查询从索引0开始查找,100条数据

附带上一本讲解的pdf哈 ,也是在网上找得,很简洁,但是可以让你少走弯路啦
http://bbs.9ria.com/thread-130766-1-1.html

转载http://blog.sina.com.cn/s/blog_8c26f28301014qrm.html

0 0
原创粉丝点击