2016-07-09 8 views
0

私は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; 

ので、ユーザーが作成し、会社に接続する必要があります:(?)それは次のようになります。私はトランザクション内でそれを持つ必要があるので、誰かが小切手/更新の間に「潜入」することはできません。

このクエリを書く方法がわかりません。助けが必要!

答えて

0

なぜROLLBACK?あなたはトランザクションを一切行っていません(DML操作)。 noobのあることのため

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; 
+0

は申し訳ありません(あなたがテストして確認する必要があります)あなたは、おそらく以下のような何かを行うことができ

をエラーメッセージを上げるおそらく、あなただけの状態をチェックすることができるとTRUE場合のみ、他のINSERTを行いますpostgresqlでは、BEGIN/COMMIT内でIF節を使用することはできません。 – Sten

+0

@Sten、おそらくあなたは何かエラーがあるかどうか試してみてください。 – Rahul

+0

@Sten、それが役立つ場合は、回答を編集してください。いくつかの構文上の問題があるかもしれませんが、それはどのようにロジックがあるべきかです。 – Rahul

関連する問題