从一段触发器代码深刻体会DML语言精髓

下面程序所创建的触发器能够在您添加一条或批处理添加多条订货数据到”订货明细”表时,自动且正确地将订单的产品数量(记录在”订货明细”表的”数量”字段中)累加到”产品数据”表的”已订购量”字段中
USE test;
GO

IF OBJECT_ID (N'trig添加_已订购量', N'TR') IS NOT NULL
DROP TRIGGER trig添加_已订购量;
GO
--创建触发器
CREATE TRIGGER trig添加_已订购量
ON 订货明细
AFTER INSERT
AS
UPDATE 产品数据 SET 已订购量 = 已订购量 + (SELECT SUM(数量) FROM inserted WHERE 产品数据.产品编号 = inserted.产品编号)
WHERE 产品数据.产品编号 IN (SELECT 产品编号FROM inserted);
GO

-- 声明一个table 变量以便用来存储要批处理添加的多条订货数据
DECLARE @订购单TABLE
(
 订单号码 int NOT NULL,
 产品编号 int NOT NULL,
 单价 money NOT NULL,
 数量 smallint NOT NULL,
 折扣 real NOT NULL
);
-- 将产品编号75 的销售数据添加到table 变量@订购单中
INSERT @订购单(订单号码,产品编号,单价,数量,折扣) VALUES ('11066','75',20.00,10,0);
INSERT @订购单(订单号码,产品编号,单价,数量,折扣) VALUES ('11055','75',20.00,21,0);
INSERT @订购单(订单号码,产品编号,单价,数量,折扣) VALUES ('11044','75',20.00,14,0);
-- 将产品编号40 的销售数据添加到table 变量@订购单中
INSERT @订购单(订单号码,产品编号,单价,数量,折扣) VALUES ('11066','40',18.40,23,0);
INSERT @订购单(订单号码,产品编号,单价,数量,折扣) VALUES ('11055','40',18.40,10,0);
-- 批处理添加订货数据前,产品编号75 与40 的已订购量
SELECT 产品编号,产品,已订购量 FROM 产品数据 WHERE 产品编号 IN ('75','40');
-- 将@订购单中的多条销售数据批处理添加到订货明细表
INSERT 订货明细 SELECT * FROM @订购单;
-- 批处理添加订货数据后,产品编号75 与40 的已订购量
SELECT 产品编号,产品,已订购量 FROM 产品数据 WHERE 产品编号 IN ('75','40');

 

做完这段代码后,突然无法理解下面这段代码(不知道怎么解释才对):

UPDATE 产品数据 SET 已订购量 = 已订购量 + (SELECT SUM(数量) FROM inserted WHERE 产品数据.产品编号 = inserted.产品编号)
WHERE 产品数据.产品编号 IN (SELECT 产品编号FROM inserted);

后经过苦思冥想,终于明白了。

这段代码的执行步骤分为3步:(一定要注意,DML语句在表中是一条一条记录执行的)

注:对表的操作很像循环语句,先判断条件,后执行

1.确定表(确定要对那个表进行更新)

UPDATE 产品数据

2.确定条件

WHERE 产品数据.产品编号 IN (SELECT 产品编号FROM inserted);

当然这段代码也可细分:(先执行括号里面的)

    a.先确定表 FROM inserted

    b.再查询“产品编号”SELECT 产品编号

3.更新字段

SET 已订购量 = 已订购量 + (SELECT SUM(数量) FROM inserted WHERE 产品数据.产品编号 = inserted.产品编号)

当然这段代码也可细分:(先执行括号里面的)

    a.先确定表FROM inserted

    b.确定条件WHERE 产品数据.产品编号 = inserted.产品编号

    c.做累加SUM(数量)

    d.显示结果SELECT

    e.做更新SET 已订购量 = 已订购量 +......


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值