SQL触发器一触发就插入多条记录
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL触发器一触发就插入多条记录相关的知识,希望对你有一定的参考价值。
我做的是影院系统,有4个表,电影信息表M MID int, MName nvarchar(50) ,播放信息表P PID int, MID, PTime datetime ,座位表S SeatID int, IsFree bit ,还有一个是电影票信息表T{TID int ,MName,PTime,SeatID,IsFree}
P中的MID是M中MID的外键
当我在P表加入一条记录时,根据S表中的座位在表T自动生成对应的票,比如S中有10个座位,就在T表生成10张票,SeatID要对应,有100个 ,就生成100张
ON P FOR INSERT
AS
DECLARE @MName nvarchar(50);
DECLARE @PTime datetime;
DECLARE @i int;
DECLARE @Num int;
DECLARE @SeatID int;
DECLARE @IsFree Boolean;
DECLARE cur_main CURSOR FAST_FORWARD FOR
SELECT SeatId, IsFree FROM S
SELECT @MName = M.MName FROM
INSERTED INNER JOIN M
ON INSERTED.MID = M.MID
SELECT @PTime = INSERTED.PTime
FROM INSERTED
SELECT @Num = COUNT(SeatID) FROM S;
OPEN cur_main
WHILE @i <= @Num
BEGIN
FETCH NEXT FROM cur_main INTO @SeatId, @IsFree;
INSERT INTO T (MName,PTime,SeatID,IsFree)
VALUES(@Mname,@PTime,@SeatID,@IsFree);
SET @i = @i + 1;
END
CLOSE cur_main;
DEALLOCATE cur_main;本回答被提问者采纳 参考技术B create TRIGGER tr on P
for INSERT
as
insert into T(Mname,PTime,SeatID,isFree)
select a.Mname,b.Ptime,c.SeatID,c.isFree from M a
join P b
on a.MID=b.MID
join S c
on 1=1
where MID in(select MID from inserted )
---------------
创建触发器如上,逻辑大体如是,自己调试一下
SQL SERVER 触发器的误区
SQL SERVER 触发器的误区
有一个AFTER INSERT 触发器,当同一事务插入多条数据时,触发器触发几次?Inserted暂存表有几条记录?
误区:同一个事务内,肯定只有一次触发,插入几条据 Inserted表内就有几条
实际情况却不尽然,要分情况,看事务内的INSERT INTO 语句怎么写的
情况一.
BEGIN TRAN I
NSERT INTO t1(field1,field2) VALUE(v001,v002);
INSERT INTO t1(field1,field2) VALUE(v001,v002);
COMMIT
结果:触发两次,Inserted表只有一条记录
情况二.
BEGIN TRAN
INSERT INTO t1(field1,field2) VALUES(v101,v102),(v201,v202);
COMMIT
结果:触发一次,Inserted表有两条记录
情况三.
BEGIN TRAN
INSERT INTO t2 SELECT id, name, address FROM t1
COMMIT
结果:触发一次,Inserted表有多条记录
结论:触发次数与是否同一事务无关,与有多个INSER INTO指令有关
以上是关于SQL触发器一触发就插入多条记录的主要内容,如果未能解决你的问题,请参考以下文章