PostgreSQL - 在条件插入后中止

时间:2017-05-03 15:07:21

标签: postgresql

如果我有条件插入作为事务的一部分。在事务中我需要插入一些不相关的数据,但是如果条件插入实际上不影响任何行,我想中止这个。

INSERT INTO TicketBookings(BookingId, ConcertId, NumSeats) SELECT 1, 1, 5 WHERE (SELECT AvailSeats FROM Concerts WHERE ConcertId = 1) >= 5;

无论是否插入一行(如果5个座位都不可用,它就赢了)它仍然是一个成功的"查询。在事务中还有一个针对某些不相关数据的INSERT,所以(据我所知)我不能使用触发器或外键,因为它不会传递我需要的无关数据。

我想要做的是获取受条件插入影响的行数,并在事务为0时中止/回滚事务。

有什么办法吗?

谢谢: - )

1 个答案:

答案 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