[SQL] 캔 INSERT는 [...] ON 충돌이 외래 키 위반에 사용?
SQL캔 INSERT는 [...] ON 충돌이 외래 키 위반에 사용?
주어진
=> select * from referenced;
referenced_id | name
---------------+-------
1 | one
2 | two
3 | three
과
=> select * from entries;
entry_id | referenced_id | name
----------+---------------+------------------
1 | 3 | references three
referenced_id 및 entry_id 기본 키가있는 곳.
나는 어느 entry_id이 이미 존재 또는 참조 된 항목이 존재하지 않는 경우 삽입을 건너 뛰고 항목에 대한 삽입 문을합니다. 첫 번째는 쉽게 이루어집니다 :
INSERT INTO entries
VALUES (1, 2, 'references two')
ON CONFLICT (entry_id) DO NOTHING;
여기가 너무 외부 키의 존재를 확인 할 수 있습니까?
해결법
-
==============================
1.예함으로써 FK 컬럼에 일치하지 않고 행을 제거, 참조 된 테이블에 입력 행을 조인
예함으로써 FK 컬럼에 일치하지 않고 행을 제거, 참조 된 테이블에 입력 행을 조인
INSERT INTO entries(entry_id, referenced_id, name) SELECT val.entry_id, val.referenced_id, val.name FROM ( VALUES (1, 2, 'references two') -- more? ) val (entry_id, referenced_id, name) JOIN referenced USING (referenced_id) -- drop rows without matching FK ON CONFLICT (entry_id) DO NOTHING; -- drop rows with duplicate id
UPSERT 자체 (INSERT ... ON CONFLICT DO의 경우 Nothing) 고유의 위반에만 반응한다. 수동 :
숫자 식 이제 직접 INSERT에 부착되지 않기 때문에, 열 유형 목표 테이블로부터 도출되지 않는다. 비 기본 유형으로 작동 할 때 명시 적 캐스트 입력 값을해야 할 수도 있습니다. 보다:
from https://stackoverflow.com/questions/36038751/can-insert-on-conflict-be-used-for-foreign-key-violations by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] WHERE 문에 대해 LIKE 및 IN을 사용하는 것이 가능? (0) | 2020.07.13 |
---|---|
[SQL] MSExcel 및 SQL 서버에서 날짜 변환의 차이 (0) | 2020.07.13 |
[SQL] 날짜 조건을 선택 쿼리 (0) | 2020.07.13 |
[SQL] 타임 스탬프 형식 열에서 날짜 시간 값을 얻을 수있는 방법이 있나요? (0) | 2020.07.13 |
[SQL] 그룹 당 첫 번째와 마지막 행에서 값을 가져 오기 (0) | 2020.07.13 |