金沙棋牌app手机下载

当前位置:金沙棋牌 > 金沙棋牌app手机下载 > MySQL触发器如何正确使用,SQL中触发器的使用

MySQL触发器如何正确使用,SQL中触发器的使用

来源:http://www.logblo.com 作者:金沙棋牌 时间:2019-11-20 14:29

创设触发器 是异样的存款和储蓄进程,自动实践,平日不要有重返值

MySQL触发器

触发器(trigger):监视某种景况,并触及某种操作。

触发器创设语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触及时间(after/before) 4.触发事件(insert/update/delete)

 

~~语法~~

CREATE TCR-VIGGE奥迪Q5 <触发器名称> --触发器必需有名字,最多六十个字符,恐怕后边会附有分隔符.它和MySQL中此外对象的命超方式基本相象.
{ BEFORE | AFTER } --触发器有实行的时光设置:能够设置为事件发生前或后。
{ INSERT | UPDATE | DELETE } --同样也能设定触发的风云:它们得以在推行insert、update或delete的经过中触发。
ON <表名称> --触发器是归于某一个表的:当在这里个表上履行插入、 更新或删除操作的时候就变成触发器的激活. 大家不能够给相通张表的同一个事变安插五个触发器。
FOR EACH ROW --触发器的施行间距:FOCRUISER EACH ROW子句公告触发器 每间距后生可畏行实践叁遍动作,并不是对全部表推行叁遍。
<触发器SQL语句> --触发器包括所要触发的SQL语句:这里的语句能够是其余合法的口舌, 蕴涵复合语句,不过此间的语句受的范围和函数的肖似。

 

create trigger triggerName

after/before insert/update/delete on 表名

for each row #那句话在mysql是确定地点的

begin

sql语句;

end;

注:各自颜色对应上边的四要素。

金沙棋牌app手机下载,先是大家来创制两张表:

#商品表

create table g

(

  id int primary key auto_increment,

  name varchar(20),

  num int

);

#订单表

create table o

(

  oid int primary key auto_increment,

  gid int,

much int

);

insert into g(name,num) values('商品1',10),('商品2',10),('商品3',10);

 

设若大家在没动用触发器以前:如若大家现在卖了3个商品1,大家要求做两件事

1.往订单表插入一条记下

insert into o(gid,much) values(1,3);

2.更新商品表商品1的剩下数量

update g set num=num-3 where id=1;

 

明天,大家来成立二个触发器:

亟待先举行该语句:delimiter $(意思是报告mysql语句的终极换来以$甘休)

create trigger tg1
after insert on o
for each row
begin
update g set num=num-3 where id=1;
end$

那儿大家只要试行:

insert into o(gid,much) values(1,3)$

会意识物品1的多寡产生7了,表达在大家插入一条订单的时候,触发器自动帮大家做了改善操作。

 

但今后会有三个难题,因为大家触发器里面num和id都是写死的,所以随意大家买哪些商品,最后更新的都以物品1的数额。比方:大家往订单表再插入一条记下:insert into o(gid,much) values(2,3),推行完后会意识商品1的数据变4了,而商品2的数量没变,那样显著不是大家想要的结果。大家要求修正大家事先创立的触发器。

笔者们怎么着在触发器引用行的值,也正是说大家要赢得大家新插入的订单记录中的gid或much的值。

对此insert来讲,新插入的行用new来表示,行中的每一列的值用new.列名来代表。

之所以以往大家能够这么来改大家的触发器

create trigger tg2
after insert on o
for each row
begin
update g set num=num-new.much where id=new.gid;(注意此处和率先个触发器的不及)
end$

其次个触发器成立实现,大家先把第二个触发器删掉

drop trigger tg1$

再来测量试验一下,插入一条订单记录:insert into o(gid,much) values(2,3)$

实施完开掘商品2的数额改为7了,今后就对了。

 

最近还留存三种景况:

1.当客户裁撤一个订单的时候,我们那边平素删除一个订单,大家是或不是索要把相应的货色数量再加回去呢?

2.当客户矫正多少个订单的数码时,大家触发器更正怎么写?

咱俩先解析一下先是种情景:

蹲点地方:o表

蹲点事件:delete

接触时间:after

接触事件:update

对于delete来讲:原本有风姿浪漫行,后来被删去,想援用被删除的那大器晚成行,用old来代表,old.列名能够援用被剔除的行的值。

这大家的触发器就该如此写:

create trigger tg3

after delete on o

for each row

begin

update g set num = num + old.much where id = old.gid;(注意那边的成形)

end$

创造完毕。

再执行delete from o where oid = 2$

会发觉商品2的数码又产生10了。

 

其次种景况:

监视地方:o表

监视事件:update

接触时间:after

接触事件:update

对此update来讲:被涂改的行,改过前的数码,用old来代表,old.列名引用被改良在此以前进中的值;

修改的后的数量,用new来代表,new.列名引用被涂改未来行中的值。

那大家的触发器就该如此写:

create trigger tg4

after update on o

for each row

begin

update g set num = num+old.much-new.much where id = old/new.gid;

end$

先把旧的数量苏醒再减去新的数目正是更正后的数目了。

作者们来测量试验下:先把商品表和订单表的多寡都清掉,易于测验。

固然大家往商品表插入五个商品,数量都以10,

买3个商品1:insert into o(gid,much) values(1,3)$

那时商品1的多寡形成7;

大家再修正插入的订单记录: update o set much = 5 where oid = 1$

我们改为买5个商品1,那个时候再查询商品表就能够开掘货品1的数据只剩5了,表明大家的触发器发挥效用了。

 

如果:要是商品表有商品1,数量是10;

我们往订单表插入一条记下:

insert into o(gid,much) values(1,20);

会发掘物品1的多少产生-10了。那便是难点的四野,因为大家事先创设的触发器是after,也正是说触发的言语是在插入订单记录之后才实施的,那样我们就不能判断新插入订单的选购数码。

 

先讲一下after和before的界别:

after是先成功多少的增加和删除改,再触及,触发的讲话晚于监视的增加和删除改操作,不恐怕影响前边的增加和删除改换作;也正是说先插入订单记录,再改善商品的数据;

before是先完结触发,再增加和删除改,触发的话语先于监视的增删改,大家就有机会判定,改革就要产生的操作;

 

咱俩用贰个天下无双案例来区分它们的区分,新建三个触发器:

#蹲点地方: 商品表o

#蹲点事件:insert

#接触时间:before

#接触事件:update

案例:当新添一条订单记录时,剖断订单的货物数量,若是数量超越10,就默许改为10

create trigger tg6

before insert on o

for each row

begin

  if new.much > 10 then

    set new.much = 10;

  end if;

  update g set num = num - new.much where id = new.gid;

end$

推行完,把前边创设的after触发器删掉,再来插入一条订单记录:

insert into o(gid,much) valus(1,20)$

施行完会发掘订单记录的多少改为10,商品1的多寡变为0了,就不相会世负数了。

 

触发器(trigger):监视某种情状,并触及某种操作。 触发器创设语法四要素:1.监视地方(table) 2.蹲点事件(insert/update/delete) 3.触发...

认知触发器:

以下的稿子重要呈报的是何等对MySQL触发器进行正确行使, MySQL数据库是在5.0 以往的连锁版本中对MySQL触发器进行引用,不常也能够用相关的触发器对数据的完整性举办保证。如小编有三个表ge_element。

 

       触发器是后生可畏种独特的仓库储存进度,它不可能被出示的调用,而是在往表中插入记录,更正记录只怕去除记录时,被机关激活。在触发器中能够查询任何表,也得以履行更头昏眼花的T-SQL语句。假若奉行的T-SQL语句实践了三个不合规操作,则足以经过回滚事务使语句不能够推行,并赶回到业务推行前的状况,Microsoft SQL Server 允许为任何给定的 INSERT、UPDATEDELETE 语句创设两个触发器。

该表中有一个region_id,对应到ge_region表中的id,但是,region_id是可认为空的,所以不应该设置外键限定,而作者在剔除ge_region表中的记录时,希望把在ge_element表中被引用到的笔录的region_id设为0,因为从没数据库的外键约束,作者只还好前后相继中操作,但作者又不想经进度序来操作,因为引用region_id的表恐怕不只ge_element贰个,此时,就恐怕用到MySQL触发器,在剔除ge_region表中的记录时,把被援用的表中的region_id设为0。

类型:

触发器的成效:

1.开立触发器的言语:

  1.后触发器 (AFTE大切诺基,FOENVISION卡塔 尔(阿拉伯语:قطر‎先试行对应语句,后施行触发器中的语句

◎触发器能够对数据库进行级联改正

CREATE T安德拉IGGE昂科拉 <触发器名称> <--

  2.前触发器  并不曾真正的实施触发语句(insert,update,delete卡塔尔国,而是进行触发后的言辞

◎触发器可以成功比CKECK限定更复杂的约束

{ BEFORE | AFTER }

  3.行级触发器 (FO奥迪Q3 EACH ROW) 在SQL server 中不设有

◎触发器能够发现改革前后表中多少的例外,并依附那些分歧来进行相应的操作。

{ INSERT | UPDATE | DELETE }

 

◎对于三个表上的例外操作(INSERT,UPDATE或然DELETE卡塔 尔(阿拉伯语:قطر‎能够选择区别的触发器,纵然是对同风度翩翩的语句也能够调用分裂的触发器达成分歧的操作。

ON <表名称>

商品号为1的仓库储存量:

◎完结一定的事情准则。

FOR EACH ROW

金沙棋牌app手机下载 1

 

<触发器SQL语句>

 

 

触发器必须有名字,最多陆拾几个字符,只怕前边会附有分隔符.它和MySQL中任何对象的命名方式为主相象.

1.后触发器(达成分化表之间的限定卡塔 尔(英语:State of Qatar)


此处笔者有个习于旧贯:正是用表的名字+'_'+触发器类型的缩写.由此生机勃勃旦是表t26,触发器是在事件UPDATE参照他事他说加以考察下边包车型地铁点2卡塔尔国和3卡塔尔国卡塔尔国以前BEFORE卡塔 尔(英语:State of Qatar)的,那么它的名字就是t26_bu。

 

语法:   CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
    { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
        [ WITH APPEND ]
        [ NOT FOR REPLICATION ]
        AS
        [ { IF UPDATE ( column )
            [ { AND | OR } UPDATE ( column ) ]
                [ ...n ]
        | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
                { comparison_operator } column_bitmask [ ...n ]
        } ]
        sql_statement [ ...n ]
    }
}

能够平昔在EMS中创立触发器。

--实现在销售量不大于库存量时,每卖出n件商品,对应商品的库存要减n,若销售量大于库存量,则回滚此次操作
IF EXISTS (SELECT *FROM sysobjects WHERE name='tr_SaleCommodity')
    DROP TRIGGER tr_SaleCommodity
GO
CREATE TRIGGER tr_SaleCommodity
ON OrderInfo FOR INSERT  --FOR/AFTER为后触发器
AS
    BEGIN
        IF EXISTS (
            SELECT  * FROM inserted I INNER JOIN CommodityInfo C ON I.CommodityId=C.CommodityId
            WHERE I.Amount>C.Amount
        )
            BEGIN
                ROLLBACK  --后触发器
                PRINT '商品的销售量大于商品的库存量'
            END    
        ELSE
            BEGIN
                UPDATE CommodityInfo
                SET Amount=Amount-(SELECT Amount FROM inserted)
                WHERE CommodityId IN
                (
                    SELECT CommodityId FROM inserted
                )
            END
    END
GO

2.接触时间:

执行:

AFTER
内定触发器仅有在触发 SQL 语句中钦命的有所操作都已成功实行后才激起。全部的引用级联操作和封锁检查也亟须成功做到后,本领实行此触发器。
即便仅内定 FO奥德赛 关键字,则 AFTEHaval 是暗许设置。
不能够在视图上定义 AFTE奥迪Q5 触发器。
INSTEAD OF
点名推行触发器实际不是实行触发 SQL 语句,从而代替触发语句的操作。
在表或视图上,每一种 INSERT、UPDATE 或 DELETE 语句最多能够定义贰个 INSTEAD OF 触发器。然则,能够在每一种具有 INSTEAD OF 触发器的视图上定义视图。
INSTEAD OF 触发器无法在 WITH CHECK OPTION 的可更新视图上定义。倘诺向钦定了 WITH CHECK OPTION 选项的可更新视图增加 INSTEAD OF 触发器,SQL Server 将发生三个荒唐。顾客必得用 ALTE奥迪Q7 VIEW 删除该选项后技术定义 INSTEAD OF 触发器。
{ [DELETE] [,] [INSERT] [,] [UPDATE] }
是钦点在表或视图上进行怎么样数据改善语句时将激活触发器的要害字。必需最少钦赐叁个选择。在触发器定义中允许采纳以随机顺序组合的那些首要字。假设钦点的选项多于八个,需用逗号分隔这一个接纳。
对此 INSTEAD OF 触发器,不允许在享有 ON DELETE 级联操作援用关系的表上使用 DELETE 选项。肖似,也分化目的在于具有 ON UPDATE 级联操作援用关系的表上使用 UPDATE 选项。

Before表示在事变产生之前执行MySQL触发器,After表示在事件时有爆发之后推行触发器;

INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods)
VALUES('YOUYOU',1,10,600,'网上银行','2014-11-11 00:00:00.000',1,1)

3.触发事件:

结果:

例1:

多少个事件:insert, update, delete

金沙棋牌app手机下载 2

在Goods表中确立删除触发器,完毕Goods表和Orders表中的级联删除。(注:那么些意义在SQLSEVE逍客二〇〇〇在此以前只好用触发器实现)

4.触发器与表的涉及:

  注意:1.上大器晚成行为出卖记录,下意气风发行为物品1的音信

 

触发器是归于三个表的,当在此个表上进行insert, update, delete操作时,就能促成相应的触发器被激活;

     2.卖出12个,仓库储存量由48改为38 

CREATE TRIGGER GoodsDelete
ON Goods    --在其上进行触发器

无法给同三个表的同二个操作创设七个分歧的触发器。

       3.方可看看以上的行销记录中的Paymoney是不得法的,它的值应该是Amount*OutPrice=10*300,所以必要前触发器来限制

AFTER DELETE
AS
DELETE FROM Orders
WHERE GoodsName IN
(SELECT Name FORM deleted)

5.触发间隔:

 


FOENCORE EACH ROW 子句通告MySQL触发器每间距豆蔻年华行实行贰次动作,并不是对整下表实践三次。

2.前触发器(能够兑现行级触发器功用卡塔尔

例2:在Orders表上树立四个AFTE索罗德触发器,当向Orders表中插入生龙活虎行(参加一条订单记录卡塔尔时,检查订单中的物品是或不是在重新整建中(查占星应物品在Goods表中的状态是或不是为1卡塔尔国,即使在整合治理中,则不能够下订单。

6.触发的SQL语句:

 

CREATE TRIGGER OrderInsert
ON Orders
AFTER INSERT
AS
IF(SELECT Status FROM Goods,Insertd WHERE Goods.Name=inserted.Name)=1
BEGIN
   PHavalINT '货色正在收拾中,无法在Orders表中增添该商品记录。'
   ROLLBACK TRANSACTION
END

触发器包罗所要触发的SQL语句:这里的讲话能够是别的合法的话语,包蕴复合语句,可是此间的语句受的范围和函数的同大器晚成。

--实现了日期校验和支付金额的计算
IF EXISTS(SELECT* FROM sysobjects WHERE name='tr_DateConfim')
    DROP TRIGGER tr_DateConfim
GO
CREATE TRIGGER tr_DateConfim
ON OrderInfo INSTEAD OF INSERT ,UPDATE
AS
    BEGIN
        DECLARE @date datetime
        SELECT @date=OrderTime FROM inserted
        IF @date BETWEEN '2012-1-1' AND '2015-1-1'
            BEGIN
                DECLARE @UserId varchar(20) ,@CommodityId int,@Amount int,@PayMoney money,@PayWay varchar(20),@OrderTime datetime,@Confirm int,@SendGoods int
                SELECT @UserId=UserId,@CommodityId=CommodityId,@Amount=Amount,@PayWay=PayWay,@OrderTime=OrderTime,@Confirm=Confirm,@SendGoods=SendGoods FROM inserted
                DECLARE @outPrice money
                SELECT @outPrice=OutPrice FROM CommodityInfo WHERE CommodityId=@CommodityId
                SET @PayMoney=@outPrice*@Amount
                PRINT 'inserted 中的数据:'+CONVERT(varchar(20),@UserId)+' '+CONVERT(varchar(20),@CommodityId)+' '+CONVERT(varchar(20),@Amount)+' '+CONVERT(varchar(20),@PayMoney)+' '+CONVERT(varchar(20),@PayWay)+' '+CONVERT(varchar(20),@OrderTime)+' '+CONVERT(varchar(20),@Confirm)+' '+CONVERT(varchar(20),@SendGoods)+' '+CONVERT(varchar(20),@outPrice)
                INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods)
                SELECT UserId,CommodityId,Amount,@PayMoney,PayWay,OrderTime,Confirm,SendGoods FROM inserted
            END
        ELSE 
            PRINT '你插入的数据中的时间只能在 2012-1-1 到 2015-1-1 中间'
    END
GO

复合语句(BEGIN / END)是官方的.

执行:

例3:在Orders表上创立多少个安顿触发器,在累积三个订单时,减弱Goods表相应物品记录的仓库储存量

流动调查整Flow-of-control卡塔尔语句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE)也是合法的.

INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayWay,OrderTime,Confirm,SendGoods)
VALUES('YOUYOU',1,5,'网上银行','2013-1-11',1,1)

CREATE TRIGGER OrdersInsert_1
ON Orders
AFTER INSERT
AS
UPDATE Goods SET Storage=Storage-inserted.Quantity
FROM Goods,inserted
WHERE Goods.Name=inserted.GoodsName

变量证明(DECLARE)以至派出(SET)是法定的.

   注意:这里插入时自己并不曾定义PayMoney,PayMoney是由此触发器来机关测算的

 

同意标准注解.

结果:


十一分处理注脚也是允许的.

日期不许确:

例4 约束Orders表的订单日期(OrderDate)无法手工业改进。

唯独在那处要铭记在心函数有受限条件:不能够在函数中访谈表.因而在函数中使用以下语句是违法的。

金沙棋牌app手机下载 3

CREATE TRIGGER OrderDataUpDat(e
ON Orders
AFTER UPDATE
IF UPDATE(OrderDate)
BEGIN
RAISEKoleosRO哈弗('不能手动修改',10,1)
ROLLBACK TRANSACTION
END

7.创办触发器的权限:

 

 

你应当要有比一点都不小的权位本领够创设MySQL触发器;作者在创建触发器的时候唤醒要有super privilege才具够创建;

日期正确:


MySQL数据库是在5.0 以往的相关版本中对MySQL触发器实行引用,有的时候也能够用相关...

打字与印刷音讯对应:@UserId+' '+@CommodityId+' '+@Amount+' '+@PayMoney+' '+@PayWay+' '@OrderTime+' '@Confirm+' '+@SendGoods+' '@outPrice

例5:判定要插入的订单中的物品名称在Goods表中是或不是留存,即便一纸空文则回滚事务.

金沙棋牌app手机下载 4

 

金沙棋牌app手机下载 5

CREATE TRIGGER OrderInsert_2
ON Orders
AFTER INSERT
AS
IF (SELECT COUNT(*) FORM Goods,inserted
WHERE Goods.Name=inserted.GoodName)=0
BEGIN
PRAV4INT('未有这种货色')
ROLLBACK TRAINSACTION
END

 


3.行级触发器(错误卡塔 尔(阿拉伯语:قطر‎

例6:INSTEAD OF触发器用于替代引起触发器实行的T-SQL语句。每当向SimpleCustomers视图实施INSERT语句时,Insertcustmer触发器被触发,当时Inserted表中早本来就有了要插入的数码,在Insertcustmer触发器的代码中,剖析插入客商姓名的字符串,将其分拆为姓和名三个字符串,并插入Customers表,而原来的INSERT语句不可能实践。

  金沙棋牌app手机下载 6

创建SimpleCustomers视图

施行结果:

通过SimpleCustomers视图向Customers表中增多记录

金沙棋牌app手机下载 7

GO
CREATE VIEW SimpleCustomers(CustomerName,city,Tel)
AS
SELECT FistName+','+LastName,City,Tel
FROM Customers
GO
CREATE TIRGGER Insertcustmer
ON SimpleCustomers
INSTEAD OF INSERT
AS
DECLARE @Name varchar(40)
DECLARE @FistName varchar(20)
DECLARE @LastName varchar(20)
DECLARE @City varchar(20)
DECLARE @Tel varchar(20)
DECLARE @idx int
BEGIN
SELECT @Name=CustomerName,@City=City,@Tel=Tel
FROM inserted
SET @idx=CHARINDEX(',',@Name)
SET @FistName=LEFT(@Name,@idx-1)
SET @LastNme=RIGHT(@Name,@LEN(@Name)-@idx)
INSERT INTO Customers
(FistName,LastName,City,Tel)
VALUES(@FistName,@LastName,@City,@Tel)
END

能够观看在SQL server中并不协理行级触发器


本文由金沙棋牌发布于金沙棋牌app手机下载,转载请注明出处:MySQL触发器如何正确使用,SQL中触发器的使用

关键词:

上一篇:没有了

下一篇:RBAC表金沙棋牌app手机下载: