zoukankan      html  css  js  c++  java
  • 【SQL 触发器】

    一.MySQL上触发器的使用

    示例:

    1 CREATE TRIGGER trigger_name
    2 trigger_time
    3 trigger_event ON tbl_name
    4 FOR EACH ROW
    5 trigger_stmt
    View Code

    trigger_name:标识触发器名称,用户自行指定;
    trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
    trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
    tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
    trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。

    由此可见,可以建立6种触发器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。

    另外有一个限制是不能同时在一个表上建立2个相同类型的触发器,因此在一个表上最多建立6个触发器。

    trigger_event 详解
    MySQL 除了对 INSERT、UPDATE、DELETE 基本操作进行定义外,还定义了 LOAD DATA 和 REPLACE 语句,这两种语句也能引起上述6中类型的触发器的触发。

    LOAD DATA 语句用于将一个文件装入到一个数据表中,相当与一系列的 INSERT 操作。

    REPLACE 语句一般来说和 INSERT 语句很像,只是在表中有 primary key 或 unique 索引时,如果插入的数据和原来 primary key 或 unique 索引一致时,会先删除原来的数据,然后增加一条新数据,也就是说,一条 REPLACE 语句有时候等价于一条。

    INSERT 语句,有时候等价于一条 DELETE 语句加上一条 INSERT 语句。

    INSERT 型触发器:插入某一行时激活触发器,可能通过 INSERT、LOAD DATA、REPLACE 语句触发;
    UPDATE 型触发器:更改某一行时激活触发器,可能通过 UPDATE 语句触发;
    DELETE 型触发器:删除某一行时激活触发器,可能通过 DELETE、REPLACE 语句触发。

    实际使用:

     1 /*
     2 触发器-- 在给firsttable插入一条数据的同时 给secondtable插入相同的数据
     3 */
     4 CREATE TRIGGER cfq_insert_one 
     5 AFTER  
     6 INSERT 
     7 ON firsttable FOR EACH ROW 
     8 INSERT INTO secondtable SET firstname =  new.firstName;/*new.firstName  就是新增加的数据*/
     9 /*展示  目标表上的触发器*/
    10 SHOW TRIGGERS LIKE 'firsttable';
    11     
    12 INSERT INTO firsttable VALUES ('李思');
    View Code

    如果,如果你打算执行多个语句,可使用BEGIN ... END复合语句结构。

    示例如下:

    1 CREATE TRIGGER testref BEFORE INSERT ON test1
    2   FOR EACH ROW BEGIN
    3     INSERT INTO test2 SET a2 = NEW.a1;
    4     DELETE FROM test3 WHERE a3 = NEW.a1;  
    5     UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
    6   END
    View Code

    二.SQL Server上的触发器 简单使用

    首先了解一下 SQL Server中的 触发器的基本语法:

    1.创建触发器

     1 create trigger trigger_name
     2 
     3   on {table_name | view_name}
     4 
     5   {for | After | Instead of }
     6 
     7   [ insert, update,delete ]
     8 
     9   as
    10 
    11   sql_statement
    View Code

    2.删除触发器

    1 drop trigger trigger_name
    View Code

    3.查看已有的触发器

    1 SELECT * FROM Sysobjects WHERE xtype = 'TR'
    View Code

    4.查看单个触发器

    1 exec sp_helptext '触发器名'
    View Code

    接下来  展示一下简单使用的例子:

    1.创建两个数据表用来 测试

    1 CREATE TABLE [dbo].[tableA](
    2     [name] [nchar](10) NULL,
    3     [age] [int] NULL
    4 ) ON [PRIMARY]
    View Code
    1 CREATE TABLE [dbo].[tableB](
    2     [id] [int] NULL,
    3     [age] [int] NULL
    4 ) ON [PRIMARY]
    5 
    6 GO
    View Code

    查看某个数据表的 创建语句 可以试用一下的方法:

    2.创建触发器 --> 测试触发器   -->   删除触发器 -->   展示触发器

     1 /*创建 触发器--在tableA上创建insert触发器*/
     2 create trigger after_insert_tableA 
     3 on tableA
     4 for insert
     5 as
     6     declare @oldId int,@newage int        /*定义自定义的变量*/
     7     select @oldId = Max(id) from tableB    /*为自定义的变量 赋值*/
     8     select @newage = age from inserted    /*inserted表是  触发器里的临时表之一*/
     9     
    10     if(@oldId is null)
    11 begin 
    12     insert into tableB values ( 1,@newage);    
    13 end
    14 else
    15     insert into tableB values ( @oldId+1,@newage);    
    16     
    17 
    18 insert into tableA values('马六',16);
    19 select * from tableA;
    20 select * from tableB;
    21 
    22 /*查看单个触发器*/
    23 exec sp_helptext 'after_insert_tableA'
    24 
    25 /*删除 触发器*/
    26 drop trigger after_insert_tableA;
    27 /*查看已有的触发器*/
    28 SELECT * FROM Sysobjects WHERE xtype = 'TR'
    View Code
  • 相关阅读:
    不弹出提示直接关闭页面
    orcale表解锁
    序列化和反序列化
    js 实现post传参
    简易实现 instanceOf
    简易实现virtualdom
    react中setState同步、异步问题
    CMake Qt 配置 OpenCV
    VS执行时打开cmd
    VS2019+Qt5.15.2环境配置
  • 原文地址:https://www.cnblogs.com/sxdcgaq8080/p/6134869.html
Copyright © 2011-2022 走看看