您的位置:金沙游乐场85155 > 大数据库 > MySQL触发器使用详解_Mysql_脚本之家

MySQL触发器使用详解_Mysql_脚本之家

发布时间:2019-12-18 00:22编辑:大数据库浏览(163)

    2对插入的临时表叫法不一。

    触发器的所在表中,触发了触发器的那一行数据。具体地:在 INSERT 型触发器中,NEW 用来表示将要插入的新数据;在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;使用方法: NEW.columnName (columnName 为相应数据表某一列名)另外,OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用(如每插入一个学生前,都在其学号前加“2013”)。

    入数据的或者更新数据,除非在触发器中写了插入或者是更新的SQL。

    NEW 与 OLD 详解

    DB2里边使用点的方式取值,但SQL Server可以使用select取值,在 DB2里使用select取值就会报错。另外 DB2里边似乎不能

    不必先“USE database_name;”了。

    CREATE TRIGGER EAS.trName for insert //插入触发器 DB2 写法 NO CASCADE BEFORE insert ON eas.T_user //SQL Server没有 把新插入的数据命名为N_ROW REFERENCING NEW AS N_ROW //SQL Server没有 FOR EACH ROW MODE DB2SQL BEGIN // SQL Server没有 ATOMIC //开始 DECLARE @U_xtfidemp1 varchar; //定义变量 DB2 写法 没有@ DECLARE @u_xtempcode1 varchar; DECLARE @u_xtempcodeCount int ; DECLARE @U_xtfidempCount int ; DECLARE @u_id1 int ; //set U_xtfidemp1=N_ROW.U_xtfidemp; //set U_xtfidemp1=N_ROW.U_xtfidemp //set u_xtempcode1=N_ROW.u_xtempcode; -- 从inserted临时表中获取记录值 //把新插入的数据赋值给变量 select @U_xtfidemp1 = U_xtfidemp, @u_xtempcode1 = u_xtempcode, @u_id1 = u_id from inserted set @u_xtempcodeCount= (select count from eas.T_user where u_xtempcode is not null and u_xtempcode=@u_xtempcode1 and u_id<>@u_id1); set @>U_xtfidempCount=(select count from eas.T_user where U_xtfidemp is not null and U_xtfidemp=@U_xtfidemp1 and u_id<>@u_id1); IF@u_xtempcodeCount>0 or @U_xtfidempCount>0 THEN // SIGNAL SQLSTATE '80000' ('eas.T_user Exceeds u_xtempcode,U_xtfidemp 插入数据时有错误,有重复'); END IF; END 
    

    创建触发器在MySQL中,创建触发器语法如下:

    4触发器的触发的方式不太一样。

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

    同时for类型的触发器,DB2在触发器里没有异常时,会插入数据或者更新数据,SQL Server在触发器里没有异常时,是不会插

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

    大部分数据库语句的基本语法是相同的,但具体到的每一种数据库,又有些不一样,例如触发器,DB2和SQL Server两种很大的不同。

    删除触发器

    可以看到虽然创建触发器的基本语法是相同的,但具体细节又不一样。

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

    3取插入的临时表数据方法不一样

    我们建立的数据库一般都是 InnoDB 数据库,其上建立的表是事务性表,也就是事务安全的。这时,若SQL语句或触发器执行失败,MySQL 会回滚事务,有:

    在SQL Server中的写法为:

    一个完整的创建触发器示例假设系统中有两个表:班级表 class(班级号 classID, 班内学生数 stuCount)学生表 student(学号 stuID, 所属班级号 classID)要创建触发器来使班级表中的班内学生数随着学生的添加自动更新,代码如下:

    CREATE TRIGGER EAS.trName NO CASCADE BEFORE insert //插入触发器 ON eas.T_user REFERENCING NEW AS N_ROW //把新插入的数据命名为N_ROW FOR EACH ROW MODE DB2SQL //每一行插入数据都出发此操作 BEGIN ATOMIC //开始 DECLARE U_xtfidemp1 varchar; //定义变量 DECLARE u_xtempcode1 varchar; DECLARE u_xtempcodeCount int ; DECLARE U_xtfidempCount int ; DECLARE u_id1 int ; set U_xtfidemp1=N_ROW.U_xtfidemp;//把新插入的数据赋值给变量 set u_xtempcode1=N_ROW.u_xtempcode; set u_id1=N_ROW.u_id; set u_xtempcodeCount= (select count from eas.T_user where u_xtempcode is not null and u_xtempcode=u_xtempcode1 and u_id<>u_id1); set U_xtfidempCount=(select count from eas.T_user where U_xtfidemp is not null and U_xtfidemp=U_xtfidemp1 and u_id<>u_id1); IF u_xtempcodeCount>0 or U_xtfidempCount>0 THEN SIGNAL SQLSTATE '80000' ('eas.T_user Exceeds u_xtempcode,U_xtfidemp 插入数据时有错误,有重复'); END IF; END 
    

    SHOW TRIGGERS [FROM schema_name];其中,schema_name 即 Schema 的名称,在 MySQL 中 Schema 和 Database 是一样的,也就是说,可以指定数据库名,这样就

    1定义变量的方式不一样.

    即其它语句之前,语法如下:

    DB2定义变量时,没有要求@开头,但是SQL Server定义时要求以@开头

    触发器的执行顺序

    通过select的方式赋值。

    MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。

    例如DB2的一个触发器:

    和查看数据库查看表格一样,查看触发器的语法如下:

    例如 DB2里可以规定是不是每一行都出发,但SQL Server里边没这样的功能,一次插入100条数据,也只触发一次。

    这时就会用到 DELIMITER 命令(DELIMITER 是定界符,分隔符的意思),它是一条命令,不需要语句结束标识,语法为:DELIMITER new_delemiternew_delemiter 可以设为1个或多个长度的符号,默认的是分号,我们可以把它修改为其他符号,如$:DELIMITER $在这之后的语句,以分号结束,解释器不会有什么反应,只有遇到了$,才认为是语句结束。注意,使用完之后,我们还应该记得把它给修改回来。

    DB2里边叫REFERENCING NEW,你可以改成其他的名称,SQL Server叫做inserted

    复制代码 代码如下:CREATE TRIGGER trigger_nametrigger_timetrigger_event ON tbl_nameFOR EACH ROWtrigger_stmt

    小伙伴们是否对mysql的触发器的使用有所了解了呢,如有疑问,就给我留言吧,大家共同进步。

    本文由金沙游乐场85155发布于大数据库,转载请注明出处:MySQL触发器使用详解_Mysql_脚本之家

    关键词: