sql server 2008在2个表上多次插入
我在SQLServer2008数据库上得到了以下触发器sql server 2008在2个表上多次插入,sql,sql-server-2008,triggers,insert,Sql,Sql Server 2008,Triggers,Insert,我在SQLServer2008数据库上得到了以下触发器 CREATE TRIGGER tr_check_stoelen ON Passenger AFTER INSERT, UPDATE AS BEGIN IF EXISTS( SELECT 1 FROM Passenger p INNER JOIN Inserted i on i.flight= p.flight
CREATE TRIGGER tr_check_stoelen
ON Passenger
AFTER INSERT, UPDATE
AS
BEGIN
IF EXISTS(
SELECT 1
FROM Passenger p
INNER JOIN Inserted i on i.flight= p.flight
WHERE p.flight= i.flightAND p.seat= i.seat
)
BEGIN
RAISERROR('Seat taken!',16,1)
ROLLBACK TRAN
END
END
当我尝试运行下面的查询时,触发器正在抛出错误。这个查询我想在两个不同航班的数据库中插入两个不同的乘客。我肯定两个座位都没有人,但我不明白为什么触发器会给我错误。它是否与相关性有关
INSERT INTO passagier VALUES
(13392,5315,3,'Janssen Z','2A','October 30, 2006 10:43','M'),
(13333,5316,2,'Janssen Q','2A','October 30, 2006 11:51','V')
更新:
表如下所示
CREATE TABLE Passagier
(
passengernumber int NOT NULL CONSTRAINT PK_passagier PRIMARY KEY(passagiernummer),
flight int NOT NULL CONSTRAINT FK_passagier_vlucht REFERENCES vlucht(vluchtnummer)
ON UPDATE NO ACTION ON DELETE NO ACTION,
desk int NULL CONSTRAINT FK_passagier_balie REFERENCES balie(balienummer)
ON UPDATE NO ACTION ON DELETE NO ACTION,
name varchar(255) NOT NULL,
seat char(3) NULL,
checkInTime datetime NULL,
gender char(1) NULL
)
如果您在插入一条记录后运行触发器,然后查找具有刚才插入的值的记录,您将始终找到它。您可以尝试使用INSTEAD OF触发器,以便在实际执行插入之前检查现有记录。如果在插入记录后运行触发器,然后查找具有刚插入的值的记录,您将始终找到它。您可以尝试一个INSTEAD OF触发器,以便在实际执行插入操作之前检查现有记录。它可能是在表中发现自己而抛出错误(循环引用回自身)。您可能希望在where子句中添加一个额外的筛选器,如“AND Passenger.ID inserted.ID”它可能会通过在表中查找自身而抛出错误(循环引用回自身)。您可能希望向where子句添加一个附加筛选器,如“AND Passenger.ID inserted.ID”此子查询存在一些问题:
SELECT 1
FROM Passenger p
INNER JOIN Inserted i on i.flight= p.flight
WHERE p.flight= i.flight AND p.seat= i.seat
首先,p.flight=i.flight的是非常不必要的,因为它已经是您加入的一部分了
其次,p.seat=i.seat
也应该是JOIN
的一部分
第三,此触发器在插入行后运行,因此它将始终匹配,因此您的触发器将始终引发错误并回滚
您可以修复触发器,但更好的方法是根本不使用触发器。如果我理解您正试图正确执行的操作,您只需要对航班、座位设置唯一的约束:
ALTER TABLE passgier
ADD CONSTRAINT IX_passagier_flightseat
UNIQUE (flight, seat)
此子查询存在一些问题:
SELECT 1
FROM Passenger p
INNER JOIN Inserted i on i.flight= p.flight
WHERE p.flight= i.flight AND p.seat= i.seat
首先,p.flight=i.flight的是非常不必要的,因为它已经是您加入的一部分了
其次,p.seat=i.seat
也应该是JOIN
的一部分
第三,此触发器在插入行后运行,因此它将始终匹配,因此您的触发器将始终引发错误并回滚
您可以修复触发器,但更好的方法是根本不使用触发器。如果我理解您正试图正确执行的操作,您只需要对航班、座位设置唯一的约束:
ALTER TABLE passgier
ADD CONSTRAINT IX_passagier_flightseat
UNIQUE (flight, seat)
请问表格的结构是什么?对不起,荷兰语和英语混在一起了。但我在荷兰工作,只是为了更好的理解这里的翻译;-)请问表格的结构是什么?对不起,荷兰语和英语混在一起了。但我在荷兰工作,只是为了更好的理解这里的翻译;-)一个触发器似乎不起作用。我刚试过,ManagementStudio说“2行受影响”,但什么也没发生。您是否在触发器中再次插入了?使用INSTEAD OF触发器,您必须在触发器中进行实际插入(如果数据通过测试)。不管怎样,我看到阿洛纳的好主意对你起了作用,所以这是个好消息。一个触发装置似乎不起作用。我刚试过,ManagementStudio说“2行受影响”,但什么也没发生。您是否在触发器中再次插入了?使用INSTEAD OF触发器,您必须在触发器中进行实际插入(如果数据通过测试)。不管怎么说,我知道Aaronaught的好主意对你有用,所以这是个好消息。我正在尝试用一个insert语句插入两个(或更多)乘客。示例中的乘客乘坐不同的航班。我会用索引试试你的建议。好的,没想到@感谢您的快速和良好的响应!这似乎是解决与索引!谢谢你的建议。我想做的是用一个insert语句插入两个(或更多)乘客。示例中的乘客乘坐不同的航班。我会用索引试试你的建议。好的,没想到@感谢您的快速和良好的响应!这似乎是解决与索引!谢谢你的建议。