2013-08-08 3 views
1

PostgreSQL에서 테이블을 업데이트하고 다른 테이블에 데이터를 동시에 삽입 할 수 있습니까?SQL 삽입 및 업데이트

UPDATE table1 
SET column4=true 
AND INSERT into table2 
SELECT column1, column2, column3 
FROM table 1 
WHERE column1="peter" 
; 
+0

당신의 포스트 그레스 버전? –

답변

2
포스트 그레스 9.1에

이상 당신과 같이 사용할 수 있습니다

WITH source AS (UPDATE table1 
       SET column4=true 
       WHERE column1='peter' 
       RETURNING column1, column2, column3) 
INSERT INTO table2 
SELECT column1, column2, column3 
FROM source; 
+1

자세한 내용을 찾으려면 "쓰기 가능한 공통 테이블 식"으로 검색하십시오. 그것은 PostgreSQL 확장입니다. –

+1

그것은 모두 한 문장으로 끝나지 만'read committed'에서 같은 순간의 동일한 데이터를 볼 필요는 없습니다. '반복 읽기'또는 더 큰 분리를 고려하십시오. –

0

처럼 당신은 트랜잭션 내에서 여러 개의 문을 실행할 수 있으므로 여전히 데이터에 원자 변화 될 것입니다. 어떤 이유 삽입이 실패하면

BEGIN; 

UPDATE table1 
SET column4=true; 

INSERT into table2 
SELECT column1, column2, column3 
FROM table 1 
WHERE column1="peter"; 

COMMIT; 

는 전체 트랜잭션이 실패하고 변화가 삽입 문 앞에 실행 된 업데이트를 포함하여, 밖으로 백업됩니다.

+0

Postgres 9.1+에서는 CTE를 사용하여 단일 명령문에서 원하는만큼 DML을 수행 할 수 있습니다. –

+1

커밋시 가시적으로 보이지는 않지만,'read committed' 모드라면 다른 누군가가 그 사이에 커밋을하면 두 문장은 여전히 ​​다른 데이터를 볼 수 있습니다. 나는 적어도'반복 가능한 읽기'분리, 바람직하게는'serializable '을 사용할 것이다. –

+0

나는 모든 트랜잭션이 성공하거나 실패 할 때 원자를 의미합니다. 두 개의 DML 문을 하나의 문으로 작성하려는 목적이 맞습니까? – GolezTrol