加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

SQLITE触发器

发布时间:2020-12-12 23:51:19 所属栏目:百科 来源:网络整理
导读:SQLite 触发器(Trigger) 【定义】 SQLite 的触发器是数据库的回调函数,它会自动执行/指定的数据库事件发生时调用。以下是关于SQLite的触发器的要点: 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
where (select id from class where id = new.classId)is null;
end;

--创建删除触发器 (删除班级时,首先根据班级编号删除该班级学生)
create trigger fk_Delete
before delete on class
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条数据

【参考地址】

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读