PostgreSQL에서 테이블을 업데이트하고 다른 테이블에 데이터를 동시에 삽입 할 수 있습니까?SQL 삽입 및 업데이트
UPDATE table1
SET column4=true
AND INSERT into table2
SELECT column1, column2, column3
FROM table 1
WHERE column1="peter"
;
PostgreSQL에서 테이블을 업데이트하고 다른 테이블에 데이터를 동시에 삽입 할 수 있습니까?SQL 삽입 및 업데이트
UPDATE table1
SET column4=true
AND INSERT into table2
SELECT column1, column2, column3
FROM table 1
WHERE column1="peter"
;
이상 당신과 같이 사용할 수 있습니다
WITH source AS (UPDATE table1
SET column4=true
WHERE column1='peter'
RETURNING column1, column2, column3)
INSERT INTO table2
SELECT column1, column2, column3
FROM source;
자세한 내용을 찾으려면 "쓰기 가능한 공통 테이블 식"으로 검색하십시오. 그것은 PostgreSQL 확장입니다. –
그것은 모두 한 문장으로 끝나지 만'read committed'에서 같은 순간의 동일한 데이터를 볼 필요는 없습니다. '반복 읽기'또는 더 큰 분리를 고려하십시오. –
처럼 당신은 트랜잭션 내에서 여러 개의 문을 실행할 수 있으므로 여전히 데이터에 원자 변화 될 것입니다. 어떤 이유 삽입이 실패하면
BEGIN;
UPDATE table1
SET column4=true;
INSERT into table2
SELECT column1, column2, column3
FROM table 1
WHERE column1="peter";
COMMIT;
는 전체 트랜잭션이 실패하고 변화가 삽입 문 앞에 실행 된 업데이트를 포함하여, 밖으로 백업됩니다.
Postgres 9.1+에서는 CTE를 사용하여 단일 명령문에서 원하는만큼 DML을 수행 할 수 있습니다. –
커밋시 가시적으로 보이지는 않지만,'read committed' 모드라면 다른 누군가가 그 사이에 커밋을하면 두 문장은 여전히 다른 데이터를 볼 수 있습니다. 나는 적어도'반복 가능한 읽기'분리, 바람직하게는'serializable '을 사용할 것이다. –
나는 모든 트랜잭션이 성공하거나 실패 할 때 원자를 의미합니다. 두 개의 DML 문을 하나의 문으로 작성하려는 목적이 맞습니까? – GolezTrol
당신의 포스트 그레스 버전? –