2016-07-09 6 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 작업)도 수행하지 않았습니다. 멍청한 놈 것에 대해

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

관련 문제