`

SQLite-CREATE TRIGGER

 
阅读更多

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删除触发器。

分享到:
评论

相关推荐

    sqlite-doc-3340000.zip

    2. SQL语法:SQLite3 支持标准的SQL语言,包括创建表(CREATE TABLE)、插入数据(INSERT)、查询数据(SELECT)、更新数据(UPDATE)、删除数据(DELETE)以及复杂的联接(JOIN)和子查询操作。 3. 数据类型:...

    SQLite-.rar_sqlite

    2. **SQL语言支持**:SQLite支持标准的SQL语法,包括创建表(CREATE TABLE)、插入数据(INSERT INTO)、查询数据(SELECT)、更新数据(UPDATE)、删除数据(DELETE)以及更复杂的联接(JOIN)、子查询(SUBQUERY)...

    Python库 | sqlite_utils-1.2.2-py3-none-any.whl

    db.execute("CREATE TRIGGER ...") ``` 3. JSON支持: 支持JSON类型字段,方便存储复杂数据结构: ```python db["json_data"].create({"data": json}) ``` 四、批量操作 sqlite_utils还提供了批量插入、更新...

    sqlitestudio-3.1.1小型本地数据库

    - **CREATE TABLE**:用于创建新表,定义表的结构,包括字段名、数据类型和约束条件。 - **INSERT INTO**:向表中插入数据,可以是单行或批量插入。 - **SELECT**:查询语句,用于从表中检索数据,可以使用WHERE子句...

    sqlite3-database.zip_sqlite3

    CREATE TRIGGER Update_Age AFTER UPDATE OF age ON Students BEGIN UPDATE Students SET age = new.age + 1 WHERE id = new.id; END; ``` 七、备份与恢复 SQLite3提供命令行工具进行数据库的备份和恢复。 - ...

    SQLITE sql语句使用总结

    sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER trigger-name [ BEFORE | AFTER ] database-event ON [database-name .] table-name trigger-action ``` 例如,创建一个名为 `update_customer_address` 的...

    SQLite触发器的SQL语法.pdf

    CREATE TRIGGER trigger-name [ BEFORE | AFTER ] database-event ON [ database-name . ] table-name trigger-action 其中,trigger-name 是触发器的名称,database-event 是触发器所响应的数据库事件,如 DELETE...

    SQLite资料

    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 ...

    SQLite的SQL语法

    - **CREATE TRIGGER**: 用于创建触发器,当特定事件发生时自动执行SQL代码。 - **DROP TRIGGER**: 用于删除触发器。 - **CREATE VIEW**: 用于创建视图,视图可以看作是从一个或多个表中导出的虚拟表。 - **DROP VIEW...

    sqlite 触发器

    CREATE [TEMP|TEMPORARY] TRIGGER trigger-name [BEFORE|AFTER] database-event ON [database-name.]table-name BEGIN trigger-action; END; ``` 其中,`database-event` 可以是以下之一: - `DELETE` - `INSERT`...

    forge-sqlite:使用Trigger.IOHTML5 iOS应用程序的本机持久性

    schema : "CREATE TABLE sample(x INTEGER PRIMARY KEY ASC, y, z)" } , success , error ) ; 全部写 接受一个对象数组。 每个对象都包含一个字符串"query"和一个包含字符串["arg"]数组。 如果写入成功执行,则此...

    sqlite3使用详解

    SQLite3也支持视图(`CREATE VIEW`)和存储过程(`CREATE FUNCTION`,`CREATE TRIGGER`),这些可以用来封装复杂的查询逻辑和业务规则。 八、备份与恢复 SQLite3提供`.backup`命令用于备份数据库,`.import`命令...

    SQLite3软件安装包

    此外,SQLite3还支持视图(VIEW)和触发器(TRIGGER),它们可以帮助你构建更复杂的数据逻辑。 为了方便开发,SQLite3还提供了丰富的API,可以与各种编程语言如C、C++、Python、Java、C#等进行集成。开发者可以通过...

    SQLite中文文档

    - 创建数据库:使用`CREATE DATABASE`语句创建新的SQLite数据库。 - 打开/关闭数据库:通过连接函数(如`sqlite3_open()`)与数据库建立连接,完成工作后使用`sqlite3_close()`关闭连接。 2. 表操作: - 创建表...

    轻型数据库SQLite结合PHP的开发

    SQLite的SQL支持非常全面,包括但不限于:ATTACH DATABASE、BEGIN TRANSACTION、COMMIT TRANSACTION、COPY、CREATE INDEX、CREATE TABLE、CREATE TRIGGER、CREATE VIEW、DELETE、DETACH DATABASE、DROP INDEX、DROP ...

    数据存储之SQLite

    3. **触发器**:利用`CREATE TRIGGER`定义特定事件发生时自动执行的操作。 4. **存储过程**:支持用户自定义函数和存储过程,增强数据库功能。 六、总结 SQLite虽小,但五脏俱全,其简单易用的特性和强大的功能使...

Global site tag (gtag.js) - Google Analytics