복붙노트

[SQL] PostgreSQL은 외래 키 삽입 삽입, / 옆 널빤지를 중첩

SQL

PostgreSQL은 외래 키 삽입 삽입, / 옆 널빤지를 중첩

나는 PostgreSQL을 9.3을 사용하고, 내가 단위 테스트에 대한 몇 가지 데이터를 삽입하는 SQL 스크립트를 작성하기 위해 노력하고있어, 나는 약간의 문제로 실행했습니다.

이제 우리는이 같은 구조 세 개의 테이블을 가지고 있다고 가정 해 봅시다 :

------- Table A -------    -------- Table B --------    -------- Table C --------
id  | serial NOT NULL      id   | serial NOT NULL       id   | serial NOT NULL
foo | character varying    a_id | integer NOT NULL      b_id | integer NOT NULL
                           bar  | character varying     baz  | character varying

열 및 B.a_id C.b_id은 각각 표 A 및 B의 ID 열에 외래 키이다.

난 할 노력하고있어,이 스크립트를 실행하기 전에 데이터베이스에 대한 ID의 하드 코딩 된 SQL에 (만드는 가정을하지 않고 순수 SQL 이러한 세 가지 각 테이블에 행을 삽입하는 것은 바람직하지 않은 것으로 보인다 이후 그 가정의 경우 ) 내가 돌아 가야 할 것이다 변경하고 테스트 데이터의 모든 적절한 ID의 재 계산한다.

참고 내가 프로그래밍 방식으로이 작업을 수행 할 수있는 실감 나는 않는하지만 테스트 스위트 데이터에 대한 더 많은 의미가 있으므로 일반적으로 쓰는 순수 SQL에서 방법은 SQL을 실행하는 프로그램 코드를 작성하는 것보다 덜 장황하다.

어쨌든, 여기에 내가 일하는 것이 생각 내가 쓴 쿼리는 다음과 같습니다

WITH X AS (
    WITH Y AS (
        INSERT INTO A (foo)
        VALUES ('abc')
        RETURNING id
    )
    INSERT INTO B (a_id, bar)
    SELECT id, 'def'
    FROM Y
    RETURNING id
)
INSERT INTO C (b_id, baz)
SELECT id, 'ghi'
FROM X;

그러나이 작동하지 않으며, PostgreSQL의 결과가 말해 :

ERROR:  WITH clause containing a data-modifying statement must be at the top level

일반적으로 이러한 유형의 쿼리를 작성하는 올바른 방법은 ID 값을 하드 코딩하지 않고 있습니까?

(이 예제를 포함하고 여기에 바이올린을 찾을 수 있습니다.)

해결법

  1. ==============================

    1.그냥 하나씩 작성하지 둥지 공통 테이블 표현식을 수행합니다

    그냥 하나씩 작성하지 둥지 공통 테이블 표현식을 수행합니다

    WITH Y AS (
      INSERT INTO A (foo)
      VALUES ('abc')
      RETURNING id
    ), x as (
      INSERT INTO B (a_id, bar)
      SELECT id, 'def'
      FROM Y
      RETURNING id
    )
    INSERT INTO C (b_id, baz)
    SELECT id, 'ghi'
    FROM X;
    
  2. from https://stackoverflow.com/questions/21386772/postgresql-nested-inserts-withs-for-foreign-key-insertions by cc-by-sa and MIT license