SQLite 触发器(Trigger)

前端之家收集整理的这篇文章主要介绍了SQLite 触发器(Trigger)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

sqlite触发器(Trigger)

【定义】

sqlite 的触发器是数据库的回调函数,它会自动执行/指定的数据库事件发生时调用。以下是关于sqlite的触发器的要点: sqlite触发器(Trigger)数据库的回调函数,它会在指定的数据库事件发生时自动执行/调用

【要点】

  • sqlite 的触发器(Trigger)可以指定在特定的数据库表发生 DELETE、INSERT 或 UPDATE 时触发,或在一个或多个指定表的列发生更新时触发。

  • sqlite 只支持 FOR EACH ROW 触发器(Trigger),没有 FOR EACH STATEMENT 触发器(Trigger)。因此,明确指定 FOR EACH ROW 是可选的。

  • WHEN 子句和触发器(Trigger)动作可能访问使用表单NEW.column-nameOLD.column-name的引用插入、删除或更新的行元素,其中 column-name 是从与触发器关联的表的列的名称

  • 如果提供 WHEN 子句,则只针对 WHEN 子句为真的指定行执行 sql 语句。如果没有提供 WHEN 子句,则针对所有行执行 sql 语句。

  • BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改删除之前或者之后执行触发器动作。

  • 当触发器相关联的表删除时,自动删除触发器(Trigger)。

  • 修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用tablename,而不是database.tablename

  • 一个特殊的 sql 函数 RAISE() 可用于触发器程序内抛出异常。

【语法】

创建触发器(Trigger)的基本语法如下:

CREATETRIGGERtrigger_name[BEFORE|AFTER]event_name

ONtable_name

BEGIN

--Triggerlogicgoeshere....

END;

在这里,event_name可以是在所提到的表table_name上的INSERT、DELETE 和 UPDATE数据库操作。您可以在表名后选择指定 FOR EACH ROW。

以下是在 UPDATE 操作上在表的一个或多个指定列上创建触发器(Trigger)的语法:

CREATETRIGGERtrigger_name[BEFORE|AFTER]UPDATEOFcolumn_name

ONtable_name

BEGIN

--Triggerlogicgoeshere....

END;

【例子】

让我们假设一个情况,我们要为被插入到新创建的 COMPANY 表(如果已经存在,则删除重新创建)中的每一个记录保持审计试验:

sqlite>CREATETABLECOMPANY(

IDINTPRIMARYKEYNOTNULL,NAMETEXTNOTNULL,AGEINTNOTNULL,ADDRESSCHAR(50),SALARYREAL

);

为了保持审计试验,我们将创建一个名为 AUDIT 的新表。每当 COMPANY 表中有一个新的记录项时,日志消息将被插入其中:

sqlite>CREATETABLEAUDIT(

EMP_IDINTNOTNULL,ENTRY_DATETEXTNOTNULL

);

在这里,ID 是 AUDIT 记录的 ID,EMP_ID 是来自 COMPANY 表的 ID,DATE 将保持 COMPANY 中记录被创建时的时间戳。所以,现在让我们在 COMPANY 表上创建一个触发器,如下所示:

sqlite>CREATETRIGGERaudit_logAFTERINSERT

ONCOMPANY

BEGIN

INSERTINTOAUDIT(EMP_ID,ENTRY_DATE)VALUES(new.ID,datetime('now'));

END;

现在,我们将开始在 COMPANY 表中插入记录,这将导致在 AUDIT 表中创建一个审计日志记录。因此,让我们在 COMPANY 表中创建一个记录,如下所示:

sqlite>INSERTINTOCOMPANY(ID,NAME,AGE,ADDRESS,SALARY)

VALUES(1,'Paul',32,'California',20000.00);

这将在 COMPANY 表中创建如下一个记录:

IDNAMEAGEADDRESSSALARY

--------------------------------------------------

1Paul32California20000.0

同时,将在 AUDIT 表中创建一个记录。这个纪录是触发器的结果,这是我们在 COMPANY 表上的 INSERT 操作上创建的触发器(Trigger)。类似的,可以根据需要在 UPDATE 和 DELETE 操作上创建触发器(Trigger)。

EMP_IDENTRY_DATE

-----------------------------

12013-04-0506:26:00

【列出触发器(TRIGGERS)】

您可以从sqlite_master表中列出所有触发器,如下所示:

sqlite>SELECTnameFROMsqlite_master

WHEREtype='trigger';

上面的 sqlite 语句只会列出一个条目,如下:

name

----------

audit_log

如果您想要列出特定表上的触发器,则使用 AND 子句连接表名,如下所示:

sqlite>SELECTnameFROMsqlite_master

WHEREtype='trigger'ANDtbl_name='COMPANY';

上面的 sqlite 语句只会列出一个条目,如下:

name

----------

audit_log

删除触发器】

下面是 DROP 命令,可用于删除已有的触发器:

sqlite>DROPTRIGGERtrigger_name;

【网上的例子】

--创建班级表
create table class
(
id integer primary key autoincrement,--班级编号
className nvarchar(50) --班级名称
);

--创建学生表
create table student
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条数据

【参考文档】

从网络上面下载了一个文档,是英文版的。但是感觉应该是sqlite的api。已经上传到了下载资源了。下载连接如下:

【参考地址】

http://www.w3cschool.cc/sqlite/sqlite-trigger.html

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

原文链接:https://www.f2er.com/sqlite/200098.html

猜你在找的Sqlite相关文章