sqlite 触发器
来源:互联网 发布:海马模拟器有mac版 编辑:程序博客网 时间:2024/05/28 18:45
数据库 表的约束有很多,其中外键是可以很好的表与表之间的关联的约束,然而在删除/修改是,用外键却比较麻烦,所以采用触发器替代外键的方案可以更好的解决这个问题。
/***创建班级表***/
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;
insert into class(className) values('aaa');
insert into class(className) values('bbb');
insert into class(className) values('vvv');
insert into student values(1,'first',1,20,4);/**插入失败,没有classId=4**/
insert into student values(1,'first',1,20,2);
/***创建更新触发器 (更新学生时要触发更新触发器去判断是否存在更新班级,存在更新成功,反之更新失败)**/
create trigger fk_Update
before update on student
for each row
begin
select raise(rollback,'还没有该班级')
where (select id from class where id = old.classId)is null; /**在update中,可以使用new/old;在new/old关键字后面的字段名是,on表里面的字段而不是当前查询class表的字段**/
end;
update student set classId=4 where classId=2; /**Error: 还没有该班级**/
update student set classId=1 where classId=2;
/***创建删除触发器 (删除班级时,首先根据班级编号删除该班级学生)**/
create trigger fk_Delete
before delete on class
for each row
begin
delete from student where classId = OLD.id;
end ;
delete from class where id=1;
/**删除触发 运行结果**/
sqlite> select * from class;
1|aaa
2|bbb
3|vvv
sqlite> select * from student;
1|first|1|20|1
sqlite> delete from class where id=1; /**删除 class 表id=1 的记录,这样会同时删除student中classId=1的记录**/
sqlite> select * from class;
2|bbb
3|vvv
sqlite> select * from student; /**会把student中classId=1 的数据删除**/
sqlite>
drop trigger fk_Delete;/**删除触发器**/
/***创建删除触发器 (删除班级时,首先根据班级编号删除该班级学生)**/
create trigger fk_Delete
before delete on class
for each row
begin
/** 第一种: 在删除class时,直接删除student相关的记录**/
/** delete from student where classId = OLD.id;**/
/**第二种:在删除class时,默认修改student相关的记录为默认值 **/
update student set classId=0 where classId = OLD.id;
end ;
insert into student values(1,'first',1,20,2);
delete from class where id=2;
/**运行结果**/
sqlite> insert into student values(1,'first',1,20,2);
sqlite> select * from student;
1|first|1|20|2
sqlite> delete from class where id=2;
sqlite> select * from student;
1|first|1|20|0
sqlite> select * from class;
3|vvv
sqlite>
在触发器,可以按照我以上的步骤,一步步做下来,都可以实现,具体原理可以在参考例子的同时,多看sqlite官方文档,对应英文不懂的可以看看
http://www.cnblogs.com/txw1958/archive/2012/11/16/sqlite-basic.html 写的还算详细
- sqlite 触发器
- sqlite 触发器
- sqlite 触发器
- sqlite触发器
- sqlite 触发器。
- SQLITE触发器
- sqlite触发器一例
- qt sqlite 触发器 使用
- Sqlite 创建触发器
- SQLite: trigger触发器
- Sqlite累加触发器
- android sqlite 触发器
- SQLite 触发器(Trigger)
- SQLite触发器使用
- Sqlite触发器关键字
- android:SQLite--触发器详解
- sqlite 建立触发器
- android sqlite 触发器
- 2009-07-24 14:17 PERL 语言中的q,qw,qr,qx,qq (zz
- 昨日数学实验
- 静态链表的基本运算
- 字符串转换成json
- make编译出错问题
- sqlite 触发器
- 更新UI时遇到:Only the original thread that created a view hierarchy can touch its views.
- 1.1linux下mpi开发环境搭建流程及过程中出现的一些问题解决方法。
- Eclipse for android 中添加CVS
- [IDE][2013-5-13] source insight 设置 函数 括号 智能缩进 设置
- html模拟弹窗
- SQL Server 压缩日志(log)文件之二?
- Silverlight中的“拖拽操作”: 把图片拖拽到Silverlight页面里。
- 关于HQL Criteria Restrictions.eq 两表关联和三表关联查询分析总结笔记