zoukankan      html  css  js  c++  java
  • 触发器、事务

    触发器的关键字为trigger,分为inserted 和 Deleted

    理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted Inserted分别表示触发事件的表旧的一条记录新的一条记录。 
         一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是: 

    Inserted和Deleted区别
      虚拟表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
    )

  • 相关阅读:
    BZOJ 3677: [Apio2014]连珠线 树形DP
    TweenMax说明
    vs 中快捷实现父类方法
    Box2d b2World的RayCast方法
    cocos2d-js 帧序列动画
    cocos2d-js 显示帧序列图中的一帧
    不同类型刚体接触测试
    FlashDevelop调试Air出错
    php 创建删除数据库
    本地php 连接 MySQL
  • 原文地址:https://www.cnblogs.com/lhn5xy/p/7911768.html
Copyright © 2011-2022 走看看