SQLite-CREATE TRIGGER
http://www.sqlite.com.cn/MySqlite/5/49.Html
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删除触发器。
发表评论
-
Android中SQLiteOpenHelper类的onUpgrade方法的作用
2012-02-09 11:50 4601Android中SQLiteOpenHelper类的onUpg ... -
在线升级Android应用程序的思路
2012-02-07 11:34 880在线升级Android应用程序的思路 http://www. ... -
Android数据库内容变化的监听
2012-02-07 11:31 6033Android数据库内容变化的监听 首先介绍内容监 ... -
android中的数据库操作
2012-02-07 10:50 1451android中的数据库操作 ... -
SQLiteOpenHelper类与自动升级数据库
2012-02-07 10:31 2283SQLiteOpenHelper类与自动升级数据库 S ... -
SQLite外键的实现
2012-02-07 10:30 1717SQLite外键的实现 SQLite现在的版本还不支持 ... -
29日修改数据库设计
2012-01-29 15:24 0数据表设计: 账号信息表account ... -
最新数据库设计
2012-01-28 21:21 0数据表设计: 工资管理 账号信息表Acc ... -
数据库设计
2012-01-11 15:27 0数据库设计 信息表:infotypecreate ta ... -
cmd下操作mysql
2011-12-20 14:11 986cmd下操作mysql 连接mysql服务器 mysql ... -
你能说出SQL聚集索引和非聚集索引的区别吗?
2011-12-07 15:18 0你能说出SQL聚集索引和非聚集索引的区别吗? http ... -
打造自己的数据访问层
2011-12-07 15:01 1287打造自己的数据访问层 http://database. ... -
MySQL数据库新特性之存储过程入门教程
2011-12-07 14:38 893MySQL数据库新特性之存储过程入门教程 http:/ ... -
论MySQL何时使用索引,何时不使用索引
2011-12-07 14:03 934论MySQL何时使用索引, ... -
详细讲解如何将数据模型转换成数据库设计
2011-12-07 12:42 1120详细讲解如何将数据模 ... -
讲解SQL与Oracle外键约束中的级联删除
2011-12-07 12:33 0讲解SQL与Oracle外键约束中的级联删除 当代 ... -
主键与外键的关系、级联保存、更新、删除
2011-12-06 14:16 7248主键与外键的关系、级联保存、更新、删除 http://www ... -
MySQL 数据类型
2011-12-06 10:18 792MySQL 数据类型 数值类型 MySQL 的数 ... -
MyISAM InnoDB 区别
2011-12-02 17:03 767MyISAM InnoDB 区别 http://www.ph ... -
事务的原理
2011-12-02 17:01 1270(1):事务(Transaction)是 ...
相关推荐
2. SQL语法:SQLite3 支持标准的SQL语言,包括创建表(CREATE TABLE)、插入数据(INSERT)、查询数据(SELECT)、更新数据(UPDATE)、删除数据(DELETE)以及复杂的联接(JOIN)和子查询操作。 3. 数据类型:...
2. **SQL语言支持**:SQLite支持标准的SQL语法,包括创建表(CREATE TABLE)、插入数据(INSERT INTO)、查询数据(SELECT)、更新数据(UPDATE)、删除数据(DELETE)以及更复杂的联接(JOIN)、子查询(SUBQUERY)...
db.execute("CREATE TRIGGER ...") ``` 3. JSON支持: 支持JSON类型字段,方便存储复杂数据结构: ```python db["json_data"].create({"data": json}) ``` 四、批量操作 sqlite_utils还提供了批量插入、更新...
- **CREATE TABLE**:用于创建新表,定义表的结构,包括字段名、数据类型和约束条件。 - **INSERT INTO**:向表中插入数据,可以是单行或批量插入。 - **SELECT**:查询语句,用于从表中检索数据,可以使用WHERE子句...
CREATE TRIGGER Update_Age AFTER UPDATE OF age ON Students BEGIN UPDATE Students SET age = new.age + 1 WHERE id = new.id; END; ``` 七、备份与恢复 SQLite3提供命令行工具进行数据库的备份和恢复。 - ...
sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER trigger-name [ BEFORE | AFTER ] database-event ON [database-name .] table-name trigger-action ``` 例如,创建一个名为 `update_customer_address` 的...
CREATE TRIGGER trigger-name [ BEFORE | AFTER ] database-event ON [ database-name . ] table-name trigger-action 其中,trigger-name 是触发器的名称,database-event 是触发器所响应的数据库事件,如 DELETE...
SQLite执行如下的语法 ALTER TABLE ANALYZE ATTACH DATABASE BEGIN TRANSACTION 注释 COMMIT TRANSACTION COPY CREATE INDEX CREATE TABLE CREATE TRIGGER CREATE VIEW DELETE DETACH DATABASE DROP INDEX DROP ...
- **CREATE TRIGGER**: 用于创建触发器,当特定事件发生时自动执行SQL代码。 - **DROP TRIGGER**: 用于删除触发器。 - **CREATE VIEW**: 用于创建视图,视图可以看作是从一个或多个表中导出的虚拟表。 - **DROP VIEW...
CREATE [TEMP|TEMPORARY] TRIGGER trigger-name [BEFORE|AFTER] database-event ON [database-name.]table-name BEGIN trigger-action; END; ``` 其中,`database-event` 可以是以下之一: - `DELETE` - `INSERT`...
schema : "CREATE TABLE sample(x INTEGER PRIMARY KEY ASC, y, z)" } , success , error ) ; 全部写 接受一个对象数组。 每个对象都包含一个字符串"query"和一个包含字符串["arg"]数组。 如果写入成功执行,则此...
SQLite3也支持视图(`CREATE VIEW`)和存储过程(`CREATE FUNCTION`,`CREATE TRIGGER`),这些可以用来封装复杂的查询逻辑和业务规则。 八、备份与恢复 SQLite3提供`.backup`命令用于备份数据库,`.import`命令...
此外,SQLite3还支持视图(VIEW)和触发器(TRIGGER),它们可以帮助你构建更复杂的数据逻辑。 为了方便开发,SQLite3还提供了丰富的API,可以与各种编程语言如C、C++、Python、Java、C#等进行集成。开发者可以通过...
- 创建数据库:使用`CREATE DATABASE`语句创建新的SQLite数据库。 - 打开/关闭数据库:通过连接函数(如`sqlite3_open()`)与数据库建立连接,完成工作后使用`sqlite3_close()`关闭连接。 2. 表操作: - 创建表...
SQLite的SQL支持非常全面,包括但不限于:ATTACH DATABASE、BEGIN TRANSACTION、COMMIT TRANSACTION、COPY、CREATE INDEX、CREATE TABLE、CREATE TRIGGER、CREATE VIEW、DELETE、DETACH DATABASE、DROP INDEX、DROP ...
3. **触发器**:利用`CREATE TRIGGER`定义特定事件发生时自动执行的操作。 4. **存储过程**:支持用户自定义函数和存储过程,增强数据库功能。 六、总结 SQLite虽小,但五脏俱全,其简单易用的特性和强大的功能使...