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张

参考技术A CREATE TRIGGER AutoInsert
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触发器一触发就插入多条记录的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER 触发器的误区

SQL Server 触发器在插入表之前验证数据

从oracle中的触发器插入多条记录

Sql Server 2005 - 插入更新触发器 - 获取更新,插入行

SQL Server插入触发器改进

SQL Server 触发器插入导致锁定直到提交