请问更新多条数据时的触发器如何编写?

拔火罐复合弓 2005-01-06 09:11:19
问题是这样的!!
我的一个(产品表) 字段 ID,分类,产品名称
一个(分类表) 字段 ID,分类名称,分类计数

我想在产品表更新数据时。分类表的(分类计数)加数或减数

产品表
ID 分类 产品名称
1 1 A产品
2 2 B产品
3 1 C产品
4 1 A产品
5 2 C产品

分类表
ID 分类名称 分类计数
1 电子 3
2 化工 2

比如Update 产品表 Set 分类=2 Where 产品名称='A产品'
分类表的结果应该为

ID 分类名称 分类计数
1 电子 1
2 化工 4

CREATE TRIGGER [产品表更新] ON [dbo].[产品表]
FOR UPDATE
AS
if update(分类)
begin
Update 分类表 set 分类计数=分类计数+1 where id In (select 分类 from inserted)
Update 分类表 set 分类计数=分类计数-1 where id In (select 分类 from Deleted)
end

如果这样写的话。。
结果就不行了。。。

ID 分类名称 分类计数
1 电子 2
2 化工 3
是否要用什么FOR语句或其它的。。。。如果编写呢???
有哪位大虾帮帮忙!!!!谢谢!!
...全文
152 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
smalldeer 2005-01-07
  • 打赏
  • 举报
回复
嗯,是有错误,不好意思,没有测试完全

回家在去看看,公司里没有环境
拔火罐复合弓 2005-01-07
  • 打赏
  • 举报
回复
用你的方法!!就是在更新同一个分类是记数是OK的。。

但更新不同的分类。。就不行了。。。。

比如 Update 产品表 Set 分类=3

产品表
ID 分类 产品名称
1 1 A产品
2 2 B产品
3 1 C产品
4 1 A产品
5 2 C产品

分类表
ID 分类名称 分类计数
1 电子 3
2 化工 2
3 其它 0

更新后
分类表
ID 分类名称 分类计数
1 电子 -2
2 化工 -3
3 其它 5
njz168 2005-01-07
  • 打赏
  • 举报
回复
只要求总数如晓露所说行的。
如果是要取各字段的具体值的话。建议用游标。
smalldeer 2005-01-06
  • 打赏
  • 举报
回复
我的脚本是测试过的,行的

用游标是个解决方法,但不是最合适的。
拔火罐复合弓 2005-01-06
  • 打赏
  • 举报
回复
CREATE TRIGGER [产品表更新] ON [dbo].[产品表]
FOR UPDATE
AS
DECLARE @tablename sysname
if update(分类表)
begin
--加数
DECLARE tnames_cursor CURSOR
FOR
select 分类 from inserted
OPEN tnames_cursor
FETCH NEXT FROM tnames_cursor INTO @tablename
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
Update 分类表 Set 分类计数=分类计数+1 Where 分类表.id=@tablename
END
FETCH NEXT FROM tnames_cursor INTO @tablename
END
CLOSE tnames_cursor
DEALLOCATE tnames_cursor
--减数
DECLARE tnames_cursor CURSOR
FOR
select 分类 from Deleted
OPEN tnames_cursor
FETCH NEXT FROM tnames_cursor INTO @tablename
WHILE (@@FETCH_STATUS <> -1)
BEGIN
IF (@@FETCH_STATUS <> -2)
BEGIN
Update 分类表 Set 分类计数=分类计数-1 Where 分类表.id=@tablename
END
FETCH NEXT FROM tnames_cursor INTO @tablename
END
CLOSE tnames_cursor
DEALLOCATE tnames_cursor
end
拔火罐复合弓 2005-01-06
  • 打赏
  • 举报
回复
不行。。。。。。。。

我已写好啦。。。。
smalldeer 2005-01-06
  • 打赏
  • 举报
回复
触发器是这样的,是执行完更新操作在进行触发器update操作的

我以前的测试
/*
关于触发器
--test1主表
--test2从表
*/

use pubs
go

create table test1(
id int identity(1,1),
name varchar(100)
)

create table test2(
id int,
idname varchar(100)
)

create trigger testinsert on test1
for insert
as
begin tran
insert test2 values(@@identity,'11')
insert test2 values(@@identity,'22')
insert test2 values(@@identity,'33')
commit tran

/*以下是测试
*/

--1.测试1
insert test1 values('aa')
insert test1 values('bb')
insert test1 values('cc')
--以上test2中插入9条记录

--2.测试2
insert into test1 select title from titles
--test2中只插入了3条记录
smalldeer 2005-01-06
  • 打赏
  • 举报
回复
create table 产品表(
ID int,
分类 int,
产品名称 varchar(50)
)
go

insert into 产品表 values(1,1,'A产品')
insert into 产品表 values(2,2,'B产品')
insert into 产品表 values(3,1,'C产品')
insert into 产品表 values(4,1,'A产品')
insert into 产品表 values(5,1,'C产品')
go

create table 分类表(
ID int,
分类名称 varchar(50),
分类计数 int
)
go

insert into 分类表 values(1,'电子',3)
insert into 分类表 values(2,'化工',2)
go


create TRIGGER [产品表更新] ON [dbo].[产品表]
FOR UPDATE
AS
if update(分类)
begin
declare @count1 int
declare @count2 int
select @count1 = count(分类) from inserted
select @count2 = count(分类) from Deleted
Update 分类表 set 分类计数=分类计数+@count1 where id In (select 分类 from inserted)
Update 分类表 set 分类计数=分类计数-@count2 where id In (select 分类 from Deleted)
end



Update 产品表 Set 分类=2 Where 产品名称='A产品'

拔火罐复合弓 2005-01-06
  • 打赏
  • 举报
回复
帮帮忙啦。
拔火罐复合弓 2005-01-06
  • 打赏
  • 举报
回复
没分了。
zengzhengliang 2005-01-06
  • 打赏
  • 举报
回复
分太少了。老大

27,580

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧