[SQL] PostgreSQL은 외래 키 삽입 삽입, / 옆 널빤지를 중첩
SQLPostgreSQL은 외래 키 삽입 삽입, / 옆 널빤지를 중첩
나는 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.그냥 하나씩 작성하지 둥지 공통 테이블 표현식을 수행합니다
그냥 하나씩 작성하지 둥지 공통 테이블 표현식을 수행합니다
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;
from https://stackoverflow.com/questions/21386772/postgresql-nested-inserts-withs-for-foreign-key-insertions by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL Server 관리 Studio에서 IntelliSense를 분실 (0) | 2020.07.07 |
---|---|
[SQL] SQL에서 조건을 실행하기 위해 '어디에'조항 (0) | 2020.07.07 |
[SQL] BigQuery에 날짜 - 분할 뷰 (0) | 2020.07.07 |
[SQL] 뷰에서 - 과학 표기법 (> 숫자 VARCHAR에서) 캐스팅 (0) | 2020.07.07 |
[SQL] "알 수없는 '필드 목록'에서 열 ',하지만 열이 존재합니까 (0) | 2020.07.07 |