触发器的关键字为trigger,分为inserted 和 Deleted
理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:
虚拟表Inserted | 虚拟表Deleted | |
在表记录新增时 | 存放新增的记录 | 不存储记录 |
修改时 | 存放用来更新的新记录 | 存放更新前的记录 |
删除时 | 不存储记录 | 存放被删除的记录 |
---------------------实例----------------------------
---创建数据表
CREATE TABLE T_Product
(
P_Id INT PRIMARY KEY IDENTITY,
P_Name NVARCHAR(24),
P_Quantity INT,
P_Price DECIMAL,
T_Id INT
)
--创建订单表
CREATE TABLE T_Order
(
O_Id INT PRIMARY KEY IDENTITY,
P_Id INT,
O_Num INT
)
------------------创建触发器--------------------
CREATE TRIGGE TriAdd ----定义触发器名称
ON T_Order----定义触发的表
FOR INSERT ---定义用那种方法触发
AS
BEGIN
--定义变量
DECLARE @num INT;
DECLARE @id INT;
--查找商品表的ID
SELECT @id=P_Id FROM INSERTED
--查找订单表的数量
SELECT @num=O_Num FROM INSERTED
---修改商品表中的数量
UPDATE T_Product SET P_Quantity-=@num WHERE P_Id=@id
END
///
CREATE TRIGGER triAdd
ON dbo.T_Order
AFTER INSERT
AS
BEGIN
DECLARE @num INT;
DECLARE @sum INT;
DECLARE @id INT;
SELECT @id=P_Id,@num=O_Num FROM INSERTED
SELECT @sum=P_Quantity FROM T_Product WHERE P_Id=@id
UPDATE T_Product SET P_Quantity=@sum-@num WHERE P_Id=@id
END
--------------------------------------事务----------------------------------------------
开始事物:BEGIN TRANSACTION
提交事物:COMMIT TRANSACTION
回滚事务:ROLLBACK TRANSACTION
BEGIN TRAN --开始事务
INSERT INTO T_Order VALUES(1,1)
INSERT INTO T_Order VALUES(1,5)
INSERT INTO T_Order VALUES(2,2)
---事务提交
COMMIT TRAN
---用一条sql语句查询出“每门”课程都大于80分的学生姓名
Name chengji fengshu
张三 数学 75
张三 语文 81
李四 数学 90
李四 语文 76
王五 数学 81
王五 语文 100
王五 英语 90
给个思路,供参考:
先查出低于80分的学生名单,然后再用姓名作为条件对比,排除刚才查到的学生
SQL Server:
select distinct [Name] from [表] where [Name] not in
(
select [Name] from [表] where [fengshu] < = 80
)