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

使用触发器自动更新统计表

最近做的项目需要实现基础数据表有数据插入的时候统计数据表能自动更新,要实现此需求目前有两种方案。方案一是通过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表,当然这只是一个简单的例子,实际情况可能会根据业务变得更加复杂,总之我们需要理清思路,通过流程图覆盖所有情形方能立于不败之地。

在 MySQL 中,可以通过创建触发器实现当向 `inventory` 中插入数据时,自动更新 `goods` 中的相关字段。触发器是一种与操作(如 `INSERT`、`UPDATE` 或 `DELETE`)绑定的特殊存储过程,可以在这些操作发生时自动执行预定义的 SQL 语句。 以下是一个具体的实现示例,用于在插入 `inventory` 时更新 `goods` 中的 `entertime`、`goods_name` 和 `goods_classify` 字段: ```sql DELIMITER $$ CREATE TRIGGER after_inventory_insert AFTER INSERT ON inventory FOR EACH ROW BEGIN UPDATE goods SET entertime = NOW(), goods_name = NEW.goods_name, goods_classify = NEW.goods_classify WHERE goods_id = NEW.inventory_goodsid; END$$ DELIMITER ; ``` 在此触发器中: - `AFTER INSERT ON inventory` 示该触发器将在每次向 `inventory` 中插入新记录后触发执行 [^4]。 - `FOR EACH ROW` 示该触发器将为插入的每一行数据执行一次 [^1]。 - `NEW` 关键字示刚刚插入到 `inventory` 中的新行,可以通过 `NEW.goods_name`、`NEW.goods_classify` 和 `NEW.inventory_goodsid` 获取插入的值,并用于更新 `goods` 中对应记录的字段 [^2]。 - `NOW()` 函数用于设置 `entertime` 字段为当前时间,示商品信息更新的时间 [^4]。 ### 注意事项 - 确保 `goods` 和 `inventory` 的存储引擎均为 `InnoDB`,以支持外键约束和事务处理 [^2]。 - 如果 `goods` 中没有 `goods_id = NEW.inventory_goodsid` 的记录,则 `UPDATE` 语句不会对任何行产生影响。 - 触发器逻辑应根据实际业务需求进行调整,例如是否需要更新所有字段,或者仅更新部分字段。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值