이 가이드에서는 단일 SQL 쿼리를 사용하여 상호 연결된 여러 Postgres 테이블에 데이터를 삽입하는 문제, 특히 초기 삽입에서 기본 키를 검색하고 후속 삽입에서 이를 외래 키로 활용해야 하는 경우에 대해 설명합니다.
문제: 단일 쿼리 내에서 3개 이상의 관련 테이블에 데이터를 효율적으로 삽입하여 적절한 외래 키 관계가 유지되도록 합니다.
해결책: 데이터 수정 CTE 활용
공통 테이블 표현식(CTE)은 우아한 솔루션을 제공합니다. 데이터 수정 CTE를 사용하면 순차적인 INSERT 작업이 가능하며, 각 후속 삽입은 이전 삽입의 결과에 따라 달라집니다.
구현 예:
다음은 데이터 수정 CTE를 사용하여 세 개의 테이블(sample
, sample1
, sample2
)에 데이터를 삽입하는 방법을 보여줍니다.
<code class="language-sql">WITH ins1 AS ( INSERT INTO sample(firstname, lastname) VALUES ('fai55', 'shaggk') RETURNING id AS sample_id ), ins2 AS ( INSERT INTO sample1 (sample_id, adddetails) SELECT sample_id, 'ss' FROM ins1 RETURNING user_id ) INSERT INTO sample2 (user_id, value) SELECT user_id, 'ss2' FROM ins2;</code>
설명:
ins1
: sample
테이블에 행을 삽입하고 새로 생성된 id
(기본 키)를 sample_id
.ins2
: sample_id
의 ins1
을 활용하여 sample1
에 행을 삽입하고 생성된 user_id
을 반환합니다.INSERT
: user_id
의 ins2
을 사용하여 sample2
에 데이터를 삽입합니다.대안: CTE를 사용한 일괄 삽입
이 접근 방식은 여러 데이터 행을 동시에 처리합니다.
<code class="language-sql">WITH data(firstname, lastname, adddetails, value) AS ( VALUES ('fai55', 'shaggk', 'ss', 'ss2'), ('fai56', 'XXaggk', 'xx', 'xx2') ), ins1 AS ( INSERT INTO sample (firstname, lastname) SELECT firstname, lastname FROM data RETURNING firstname, lastname, id AS sample_id ), ins2 AS ( INSERT INTO sample1 (sample_id, adddetails) SELECT ins1.sample_id, d.adddetails FROM data d JOIN ins1 USING (firstname, lastname) RETURNING sample_id, user_id ) INSERT INTO sample2 (user_id, value) SELECT ins2.user_id, d.value FROM data d JOIN ins1 USING (firstname, lastname) JOIN ins2 USING (sample_id);</code>
data
CTE 내에서 정의하여 여러 행을 효율적으로 삽입합니다.
중요 고려 사항:
ON CONFLICT
을 활용하여 잠재적인 중복 키 오류를 관리하세요.이 포괄적인 접근 방식은 단일 쿼리 내에서 관련 Postgres 테이블 전체의 데이터 삽입을 관리하기 위한 강력하고 효율적인 방법을 제공합니다.
위 내용은 단일 쿼리로 여러 관련 Postgres 테이블에 데이터를 삽입하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!