2014-04-01 1 views
3

난`:PostgreSQL의 멀티 INSERT는 ... 여러 열이 반환 인 3 개 테이블을 가진, 백엔드로 포스트 그레스 9.3로 데이터베이스를 구축

table1 (user_id, username, name, surname, emp_date) 
table2 (pass_id, user_id, password) 
table3 (user_dt_id, user_id, adress, city, phone) 

에서 볼 수있는 바와 같이 table2table3table1의 자식 테이블입니다.
I는 table1 (부모)에 새로 삽입 된 행의 user_id를 추출 할 수

INSERT INTO "table1" (default,'johnee','john','smith',default) RETURNING userid; 

내가 고유 다른 데이터와 함께 user_idtable2의 열과 table3로 (table1부터) 새롭게 추출 된 ID를 삽입 할 필요 그 테이블들. 기본적으로 3 엑스 삽입 ...
어떻게해야합니까?

답변

4

data-modifying CTEs을 사용하여 세 개의 INSERT를 연결하십시오. 이런 식으로 뭔가 :

WITH ins1 AS (
    INSERT INTO table1 (username, name, surname) 
    VALUES ('johnee','john','smith') 
    RETURNING user_id 
    ) 
, ins2 AS (
    INSERT INTO table2 (user_id, password) 
    SELECT ins1.user_id, 'secret' 
    FROM ins1       -- nothing to return here 
    ) 
INSERT INTO table3 (user_id, adress, city, phone) 
SELECT ins1.user_id, ... 
FROM ins1 
RETURNING user_id; 
  • 이 항상 (임시 코드 제외) INSERT들에 대한 열 정의 목록를 추가하는 것이 좋습니다. 그렇지 않으면 테이블 구조가 변경되면 코드가 놀라운 방식으로 중단 될 수 있습니다.

  • 열 정의 목록에서 열을 생략하고만 입력하면됩니다. 기본값은 자동으로 적용됩니다. 짧고 같은 결과. 당신이 결과 user_id이 시퀀스 또는 다른 기본에서 분명히 (반환하려는 경우

  • 마지막 RETURNING 그것은 실제로 table3에서 user_id을 반환합니다. 선택 사항이지만 일부 트리거 또는 방해하는 다른 마법을하지 않는 이상은 동일합니다.

    데이터 수정 (일명 "쓰기") 열팽창 계수에 대한

자세한 내용 :

+1

고마워요, 그게 정확히 내가 뭘 찾고 있었는지 .. 또한 쉽게 설명해주었습니다. 나는 이것들이 어떤 방식 으로든 (DELETE, UPDATE, ...) 같은 방식으로 중첩 될 수 있다고 가정합니다. , ... 어쨌든, 자리에서 이해할 수있는 ... – user3483211