sql update 语句
有两个表student和class结构如下createdatabasetriDatausetriDatacreatetableclass(班级intprimarykey,...
有两个表student 和 class 结构如下
create database triData
use triData
create table class
(
班级 int primary key,
人数 int
)
create table student
(
编号 char(3) primary key not null,
姓名 nchar(4) not null,
班级 int foreign key references class(班级)
)
insert into student values('001','王维',1)
insert into student values('002','张超',2)
insert into student values('003','赵云',2)
insert into student values('004','胡涛',1)
insert into student values('005','马旭',2)
insert into student values('006','赵新',2)
insert into class(1,2)
insert into class(2,4)
--建立触发器
create trigger update_student on student
for update
as
declare @班级 int
select @班级=班级 from inserted
update class set 人数 = 人数 + @@rowcount
where 班级=@班级
update student set 班级=1 where 姓名 like '赵%'
进行更新的时候 被更新的班级的人数增加 几个人。同时更改减少的另一个班级的人数。现在我只能增加人数,怎么减少对应班级的人数?还望高手指点。
还有inserted,deleted,这几个在触发器里面究竟代表什么,是不是没有updated这个关键字呢?
谢谢…… 展开
create database triData
use triData
create table class
(
班级 int primary key,
人数 int
)
create table student
(
编号 char(3) primary key not null,
姓名 nchar(4) not null,
班级 int foreign key references class(班级)
)
insert into student values('001','王维',1)
insert into student values('002','张超',2)
insert into student values('003','赵云',2)
insert into student values('004','胡涛',1)
insert into student values('005','马旭',2)
insert into student values('006','赵新',2)
insert into class(1,2)
insert into class(2,4)
--建立触发器
create trigger update_student on student
for update
as
declare @班级 int
select @班级=班级 from inserted
update class set 人数 = 人数 + @@rowcount
where 班级=@班级
update student set 班级=1 where 姓名 like '赵%'
进行更新的时候 被更新的班级的人数增加 几个人。同时更改减少的另一个班级的人数。现在我只能增加人数,怎么减少对应班级的人数?还望高手指点。
还有inserted,deleted,这几个在触发器里面究竟代表什么,是不是没有updated这个关键字呢?
谢谢…… 展开
2个回答
展开全部
按你这个脚本直接改:
create trigger update_student on student
for update
as
begin
declare @班级 int
select @班级=班级 from inserted
update class set 人数 = 人数 + @@rowcount
where 班级=@班级
select @班级=班级 from deleted
update class set 人数 = 人数 - @@rowcount
where 班级=@班级
end
inserted是刚刚增加的整行,deleted是刚刚删除的整行数据
没有updated,update的过程就是先delete,再insert,所以用inserted和deleted能表达update的过程了
另外你这个触发器只能对更新结果是1个班级的有效,如果是多个班级,在select @班级=班级 from inserted这句上会报错
最好的办法还是
create trigger update_student on student
for update
as
begin
update class set 人数 = 人数 + 人数_add
from (select 班级,count(1) as 人数_add from inserted group by 班级) b
where class.班级=b.班级
update class set 人数 = 人数 - 人数_min
from (select 班级,count(1) as 人数_min from deleted group by 班级) b
where class.班级=b.班级
end
create trigger update_student on student
for update
as
begin
declare @班级 int
select @班级=班级 from inserted
update class set 人数 = 人数 + @@rowcount
where 班级=@班级
select @班级=班级 from deleted
update class set 人数 = 人数 - @@rowcount
where 班级=@班级
end
inserted是刚刚增加的整行,deleted是刚刚删除的整行数据
没有updated,update的过程就是先delete,再insert,所以用inserted和deleted能表达update的过程了
另外你这个触发器只能对更新结果是1个班级的有效,如果是多个班级,在select @班级=班级 from inserted这句上会报错
最好的办法还是
create trigger update_student on student
for update
as
begin
update class set 人数 = 人数 + 人数_add
from (select 班级,count(1) as 人数_add from inserted group by 班级) b
where class.班级=b.班级
update class set 人数 = 人数 - 人数_min
from (select 班级,count(1) as 人数_min from deleted group by 班级) b
where class.班级=b.班级
end
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询