触发器实现表数据自动更新

最近做的项目需要实现基础数据表有数据插入的时候统计数据表能自动更新,要实现此需求目前有两种方案。方案一是通过Job定时执行,计算基础数据表中的数据,然后更新统计表;方案二采用触发器,因为已知基础数据表只会有数据插入操作,不会更新,可以建立插入触发器。比较两种方案,考虑到系统访问的实时性比较高,因此决定采用方案二。

基础表 [dbo].[table1]  的建表语句

CREATE TABLE [dbo].[table1](
	[id] [int] NOT NULL,
	[amount] [int] NOT NULL,
	[type] [varchar](50) NULL
) ON [PRIMARY]

统计表 [dbo].[table5] 的建表语句

CREATE TABLE [dbo].[table5](
	[id] [int] NOT NULL,
	[sum_amount] [int] NOT NULL,
	[avg_amount] [int] NOT NULL
) ON [PRIMARY]

GO


每当 table1 插入数据的时候,就需要更新 table5 ,根据 table1 中的 id 统计不同 id 的总的数量,以及不同 id 按 type 求总的数量的平均值。可以在 table1 上建立如下触发器实现。

-- =============================================
-- Author:		<Author,,Name>
-- Create date: <Create Date,,>
-- Description:	<Description,,>
-- =============================================
CREATE TRIGGER [dbo].[tr_statamount]
   ON  [dbo].[table1]
   AFTER insert
AS 
BEGIN
    update table5 set sum_amount=a.sum_amount,avg_amount=a.avg_amount
    from
    (
		select t.id,sum(amount) as sum_amount,avg(amount) as avg_amount from
		(
			select inserted.* from inserted 
			inner join table5 on inserted.id=table5.id
			union 
			select table1.* from table1 
			inner join table5 on table1.id=table5.id
		)t group by t.id
    ) a inner join table5 b on b.id=a.id
    

	insert into table5 
	select t.id,t.amount,t.amount from inserted t
	left join table5 a on t.id=a.id
	where a.id is null
END

GO


例如当前 table1 和 table5 的数据如下

现在插入一条全新 id 的数据,该 id 在 table1 和 table5 中均没有记录,那么这条记录应该是在插入 table1 的时候同时插入 table5。用如下插入数据脚本

INSERT INTO [master].[dbo].[table1]
           ([id]
           ,[amount]
           ,[type])
     VALUES
           (5
           ,200
           ,'A')


查询基础数据表和统计表

再插入一条数据,该数据的 id 已经在 table1 中存在,那么 table1 增加一条数据,但是 table5 数据不增加,只是更新总量和平均量,例如执行下面的脚本

INSERT INTO [master].[dbo].[table1]
           ([id]
           ,[amount]
           ,[type])
     VALUES
           (4
           ,700
           ,'A')


执行后,结果为

总结

通过触发器实现表数据的自动更新,关键是需要考虑全面,A表插入数据,B表自动更新,必须考虑B表自动更新的多种情况,可能A表的数据在B表不存在,可能A表的数据已经更新过B表,当然这只是一个简单的例子,实际情况可能会根据业务变得更加复杂,总之我们需要理清思路,通过流程图覆盖所有情形方能立于不败之地。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
SQL Server触发器是一种特殊类型的存储过程,它会在指定的上发生特定事件时自动执行。当上发生更新操作时,可以通过触发器来更新数据触发器通常与INSERT、UPDATE和DELETE语句一起使用。当这些语句被执行时,触发器会自动调用并执行相关的操作。 在创建触发器时,需要指定触发器要绑定到的以及要触发的事件类型(INSERT、UPDATE、DELETE)。然后,可以编写触发器的主体部分,该部分包含在触发器被调用时要执行的SQL语句。 当触发器绑定的上发生与触发器事件类型匹配的操作时,触发器会自动执行。在执行过程中,可以使用内置的Inserted和Deleted来引用被修改的数据。Inserted包含插入或更新操作所添加或修改的行,而Deleted包含删除或更新操作所删除或修改的行。 通过在触发器的主体部分编写更新操作的SQL语句,可以实现数据的更新。这些更新可以是根据触发器事件导致的数据更改,也可以是根据其他或计算逻辑生成的数据。 使用触发器更新数据的好处是,在数据变更时自动执行相关操作,而无需手动干预。这可以保证数据的一致性和完整性,并减少人为错误的可能性。 需要注意的是,使用触发器更新数据时,应谨慎操作,避免造成循环触发和性能问题。同时,触发器的相关操作应经过充分的测试和验证,确保其正常运行并达到预期的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值