如果我有条件插入作为事务的一部分。在事务中我需要插入一些不相关的数据,但是如果条件插入实际上不影响任何行,我想中止这个。
INSERT INTO TicketBookings(BookingId, ConcertId, NumSeats) SELECT 1, 1, 5 WHERE (SELECT AvailSeats FROM Concerts WHERE ConcertId = 1) >= 5;
无论是否插入一行(如果5个座位都不可用,它就赢了)它仍然是一个成功的"查询。在事务中还有一个针对某些不相关数据的INSERT,所以(据我所知)我不能使用触发器或外键,因为它不会传递我需要的无关数据。
我想要做的是获取受条件插入影响的行数,并在事务为0时中止/回滚事务。
有什么办法吗?
谢谢: - )
答案 0 :(得分:0)
在没有插入行时触发异常的一种解决方案,除以零。
插入了一行,确定:
BEGIN
Time: 0.087 ms
t=# with i as (insert into s100 (rec_time) select 0 where true returning 1 as c) select 2/count(1) from i;
?column?
----------
2
(1 row)
Time: 0.266 ms
t=# end;
COMMIT
Time: 1.651 ms
零行将中止交易:
BEGIN
Time: 0.082 ms
t=# with i as (insert into s100 (rec_time) select 0 where false returning 1 as c) select 2/count(1) from i;
ERROR: division by zero
Time: 0.276 ms
t=# end;
ROLLBACK
Time: 0.178 ms