2013-03-22 4 views
0

안녕하세요 postgreSql 테이블에서 다음 작업을 시도하고 있지만 구문에 문제가 있습니다.PostgreSQL 테이블 A에 테이블 A에 값이 포함되어 있지 않으면 삽입하십시오.

Psuedocode은 :

if (tableA.column1 does not contain value1) 
{ 
    INSERT INTO tableA (column1, column2) 
    VALUES value1, value2 
} 

// do this check even if the above already existed 
if (tableB does not contain value1 and value3 in the same row) 
{ 
    // it is ok if value1 and value3 already exist in the table, just not the same row 
    INSERT INTO tableB (column1, column2) 
    VALUES (value1, value3) 
} 

return true 

이 작업에 대한 실제 구문에 어떤 도움이 많이 주시면 감사하겠습니다!

+0

첫 번째 조건과 두 번째 조건이 함께 "속한"방법은 없습니다. 둘 다 서로 독립적으로 실행할 수 있습니다. –

+0

흥미 롭다. 이제 나는 그것을 보았다. 좋은 지적을했다. – dcoffey3296

답변

2
-- first insert: 
insert into tablea (col1, col2) 
select 1,2 
from tablea 
where not exists (select * from tablea where col1 = 1); 

-- second insert (same logic to apply a conditional insert) 
insert into tableb (col1, col2) 
select 1,2 
from tableb 
where not exists (select * from tableb where col1 = 1 and col2 = 2); 
+1

동일한 레코드를 동시에 검사하고 삽입하는 여러 트랜잭션 때문에 테이블을 '잠궈'거나 오류 (고유 한 경우)를 처리 할 준비가되거나 중복되지 않는 경우 (고유하지 않은 경우)를 기억하십시오. –

+0

@CraigRinger : 왜 잠금인가? 단순히 하나의 트랜잭션으로 충분하게 래핑되지 않습니까? – mvp

+0

@mvp 다른 사람이 동시에 '삽입'되는 것을 안다면, 그렇습니다. 그러나 당신이 알고있는 것을 안다면, 어느 것도 잠글 필요가 없습니다. 삽입물은 서로를 차단하지 않습니다. 두 개의 동시 삽입 사이에 고유 한 키가 공유되면 * both *가'SELECT'되고 키가 존재하지 않는다는 것을 알게되면 두 키가 모두 삽입을 시도합니다. 하나는 이기고, 다른 하나는 충돌하는 행을 볼 수 없어도 중복 키 오류로 커밋하지 못합니다. * 고유 키가 *없는 경우 가시성 규칙에 따라 다른 행이 삽입되는 행과 삽입되는 행이 표시되지 않습니다. –

관련 문제