我创建了一个表student
,我想创建一个停止添加的触发器
老师在6岁以后给任何学生,所以每5个学生只有1个老师。
student
表中的教师ID是外键,因此我可以在学生表中重复
5次,当我插入6 ..不同意我尝试这个代码,但它不起作用
student
表如下所示:
CREATE TABLE student
(
s_id int PRIMARY key,
s_name varchar(50) ,
birthday date ,
t_id int
)
触发器:
CREATE TRIGGER tr_student
on student
DECLARE
@count int,
@s_id int,
@s_name nvarchar(50),
@birthdate date,
@t_id int
Begin
select @s_id = i.s_id from inserted i;
select @s_name = i.s_name from inserted i;
select @birthdate = i.birthday from inserted i;
select @t_id = i.t_id from inserted i;
Select count(*) t_id
From student
Where @count = t_id
If @count < 6
Insert into student(s_id, s_name, birthday, t_id)
values(@s_id, @s_name, @birthdate, @count)
PRINT 'AFTER INSERT trigger fired'
End
答案 0 :(得分:0)
您的根本缺陷是,您似乎希望触发器每行一次 - 这在SQL Server中是 NOT 。相反,触发器会在每个语句时触发,而伪表un
可能包含多行。
鉴于该表可能包含多行 - 您希望在这里选择哪一行?
Inserted
未定义 - 您将从select @s_id = i.s_id from inserted i;
select @s_name = i.s_name from inserted i;
select @birthdate = i.birthday from inserted i;
select @t_id = i.t_id from inserted i;
中的任意行获取值,并且忽略所有其他行。
您需要使用Inserted
WILL 包含多行的知识重写整个触发器!您需要使用基于集合的操作 - 不要只期望Inserted
中的一行!
此外:触发器触发 AFTER 插件已经发生,所以你的代码在这里:
Inserted
基本上再次插入相同的数据 - 当然不是你想要的。
所以你需要
If @count < 6
Insert into student(s_id, s_name, birthday, t_id)
values(@s_id, @s_name, @birthdate, @count)
Inserted
触发器,或更改触发逻辑