关于SQLite基础部分:SQLite基础学习
SQLite 的触发器是数据库的回调函数,它会自动执行/指定的数据库事件
发生时调用。SQLite 的触发器可以指定在特定的数据库表发生 delete、
insert或update时触发,或在一个或多个指定表的列发生更新时触发。
SQLite 只支持 FOR EACH ROW 触发器,不支持 FOR EACH STATEMENT 触发器。FOR EACH ROW是指触发器在操作每一行时被激活;FOR EACH STATEMENT是指在执行每条SQL语句时被激活;如果有when 子句,则只针对 when 子句为真的指定行执行 SQL 语句。如果没有提供 when 子句,则针对所有行执行 SQL 语句。BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。当触发器相关联的表删除时,自动删除触发器(Trigger)。要修改的表必须存在于同一数据库中。一个特殊的 SQL 函数 RAISE() 可用于触发器程序内抛出异常。
/** 触发器的格式
*
* create trigger trigger_nameXX
before/after
* insert/update/delete on table_nameXX when xxxxx
* for each row
* begin
* XXXXXXXXXX;
* end;
*/
下面是是一个详细的例子:
1、建立两张表:
/** 部门信息表
* department_id 部门编号
* department_name 部门名称
*/
String sql="CREATE TABLE IF NOT EXISTS departmentinfo (department_id integer primary key autoincrement,department_name varchar(20))";
/** 员工信息表
* emp_id 员工编号
* emp_name; 员工名称
* department_id 部门编号
*/
String sq2="CREATE TABLE IF NOT EXISTS empinfo (emp_id integer primary key autoincrement,emp_name varchar(20),department_id integer)";
打开cmd,添加进两张表:
关于sqlite在cmd中的打开操作,请点击
2、创建触发器
/**
*
* 创建触发器
* 1、当emp_info插入员工信息时,先要检查部门信息表中是否有该部门编号,
* 如果没有则插入失败,返回no department_id
* 2、当emp_info更新员工信息时,先要检查部门信息表中是否有该部门编号,
* 如果没有则更新失败,返回no department_id
* 3、当删除部门信息表中某一行数据时,相应的在empinfo表中对应的员工也应该删除
*/
//创建触发器1
String trigger1="create trigger emp_insert " +
"before insert on empinfo " +
"for each row " +
"begin " +
"select raise(rollback,'on department_id') " +
"where (select department_id from departmentinfo where department_id=new.department_id) is null; " +
"end;";
//创建触发器2
String trigger2="create trigger emp_update " +
"before update on empinfo " +
"for each row " +
"begin " +
"select raise(rollback,'on department_id') " +
"where (select department_id from departmentinfo where department_id=new.department_id) is null; " +
"end;";
//创建触发器3
String trigger3="create trigger dep_delete " +
"before delete on departmentinfo " +
"for each row " +
"begin " +
"delete from empinfo where department_id=old.department_id; " +
"end;";
在cmd中
创建:emp_insert
创建:emp_update
创建:dep_delete
3、插入数据测试
现在测试emp_insert触发器:
从上图中分析,由于在departmentinfo表中还没有部门编号,所以员工信息表中插入数据失败,返回no department_id。
下面插入测试数据:
Insert into departmentinfo values(1,’java’);
Insert into departmentinfo values(2,’c’);
Insert into empinfo values(1,’atm’,1);
Insert into empinfo values(2,’atm2’,1);
Insert into empinfo values(3,’atm3’,2);
现在测试dep_delete触发器:
从上图中可以看出,删除了departmentinfo表中的department_id=2;与此同时empinfo表中department_id=2的员工信息也删除了
现在测试emp_update触发器:
由于departmentinfo中没有department_id=3这个编号,所以插入失败,返回错误值no department_id
4、列出所有的触发器
1、列出所有触发器
SELECT name FROM sqlite_master WHERE type = 'trigger'
2、列出emp_info中所有触发器
SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'emp_info';
5、删除触发器
drop trigger trigger_name
eg:drop trigger dep_delete
6、特殊的 SQL 函数 RAISE()
RAISE ( ABORT , error-message )
RAISE ( FAIL , error-message )
RAISE ( ROLLBACK, error-message )
RAISE ( IGNORE )
ABORT&& FAIL&&ROLLBACK && IGNORE
abort,fail,rollback三者的具体区别也不太明白,自己测试了一下,插入失败三者同样换回error-message。如何有了解的朋友请留言,谢谢。
7、 new&& old的问题
new是新插入的数据,old是原来的数据
insert只会有new,代表着要插入的新记录
delete只会有old,代表着要删除的记录
update由于执行的是先删除旧的记录,再插入新的记录,因此new和old都会有。