>데이터 베이스 >MySQL 튜토리얼 >데이터 무결성을 유지하면서 동시에 여러 Postgres 테이블에 데이터를 삽입하려면 어떻게 해야 합니까?

데이터 무결성을 유지하면서 동시에 여러 Postgres 테이블에 데이터를 삽입하려면 어떻게 해야 합니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-12 14:36:41927검색

How can I insert data into multiple Postgres tables simultaneously while maintaining data integrity?

PostgreSQL에서 동시에 여러 테이블에 데이터 삽입

단일 쿼리를 사용하여 여러 테이블에 데이터를 삽입하면 데이터베이스 작업의 일관성과 효율성이 보장됩니다. 이는 아래와 같이 데이터 수정 공통 테이블 표현식(CTE)을 사용하여 달성할 수 있습니다.

데이터를 사용하여 CTE 수정:

다음 쿼리는 데이터 수정 CTE를 사용하여 세 개의 테이블에 데이터를 연속적으로 삽입합니다.

<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>

각 INSERT는 이전 INSERT에 의존하므로 올바른 키를 얻고 후속 삽입에 사용됩니다.

또는 전체 데이터 행을 제공하여 다음을 수행합니다.

더 편리한 방법은 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>

이 방법을 사용하면 여러 행의 데이터를 삽입할 수 있으며 첫 번째 INSERT에 대해 다른 값을 선택하여 중복 행을 처리합니다.

동시성 및 고유 제약 조건 문제 해결:

잠재적인 동시성 문제를 해결하고 데이터 무결성을 보장하려면 sample 테이블의 (firstname, lastname) 열에 UNIQUE 제약 조건을 추가하고 INSERT 쿼리에 ON CONFLICT 절을 다음과 같이 사용할 수 있습니다. 링크된 참조에 설명된 대로 아래에 설명되어 있습니다.

위 내용은 데이터 무결성을 유지하면서 동시에 여러 Postgres 테이블에 데이터를 삽입하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.