sqlite数据库与mysql、sql的语法区别不大,部分语法的区别是在命令前加了 . 号。
sqlite数据库便利,不需要安装,它的数据库只需要附带一个文本就可以操作和访问,很轻小。
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 删除触发器。
--创建班级表
create table class
(
id integerprimary key autoincrement,--班级编号
classNamenvarchar(50) --班级名称
);
--创建学生表
create table student
stuNamenvarchar(20),--学生名称
stuSexbit,--性别
stuAgeinteger,--年龄
classId --班级编号
--创建插入触发器 (创建学生时要触发插入触发器去判断是否存在该班级,存在插入成功,反之插入失败)
create trigger fk_Insert
before insert on student
for each row
begin
selectraise(rollback,'还没有该班级')
where(select id from class where id = new.classId ) isnull;
end;
--创建更新触发器 (更新学生时要触发更新触发器去判断是否存在更新班级,存在更新成功,反之更新失败)
create trigger fk_Update
before update on student
where(select id from class where id = new.classId)isnull;
--创建删除触发器 (删除班级时,首先根据班级编号删除该班级学生)
create trigger fk_Delete
before delete on class
for each row
delete from student where classId = old.classId;
end ;
insert into class(className) values('s1t64');
insert intostudent(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条数据
下面是用c语言来操作sqlite,讲解详见http://hi.baidu.com/328500920/item/b08f46f3c7ffc10e85d27806 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|