복붙노트

[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. ==============================

    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에 부착되지 않기 때문에, 열 유형 목표 테이블로부터 도출되지 않는다. 비 기본 유형으로 작동 할 때 명시 적 캐스트 입력 값을해야 할 수도 있습니다. 보다:

  2. from https://stackoverflow.com/questions/36038751/can-insert-on-conflict-be-used-for-foreign-key-violations by cc-by-sa and MIT license