如果满足特定条件,则在插入之前回滚事务

时间:2016-07-09 17:10:06

标签: postgresql transactions

我正在使用Postgresql 9.5,并希望创建一个只在满足某些条件时才插入行的查询。应该(?)看起来像这样:

BEGIN;
   >> WHAT SHOULD I DO ON THE FOLLOWING LINES?
   >> I WANT TO ACCOMPLISH SOMETHING LIKE THIS:
    IF (SELECT COUNT(*) FROM roles WHERE company_id = $(companyId)) + 1 >= 
       (SELECT max_count FROM companies WHERE id = $(companyId)) 
       THEN ROLLBACK/THROW OR WHATEVER
   <<  
   INSERT INTO users (user_id, ...) VALUES (...)
   INSERT INTO roles (user_id, company_id) VALUES (...)
COMMIT;

因此,应该创建用户并将其连接到公司,除非已经有足够的人连接到该公司。我需要在交易中拥有它,以便有人不能潜入&#34;检查/更新之间。

我不确定如何编写此查询。需要帮助!

1 个答案:

答案 0 :(得分:0)

为什么ROLLBACK?您尚未完成任何交易(DML操作)。可能,您可以检查条件,如果TRUE那么只执行INSERT否则引发错误消息

您可以执行以下操作(您需要测试并查看)

DECLARE count1, maxCount INT;
begin
 SELECT COUNT(*) INTO count1 FROM roles WHERE company_id = $(companyId)) + 1;
 SELECT max_count INTO maxCount FROM companies WHERE id = $(companyId);

IF(count1 >= maxCount) THEN
BEGIN;
   INSERT INTO users (user_id, ...) VALUES (...)
   INSERT INTO roles (user_id, company_id) VALUES (...)
COMMIT;
END IF;
END;