2017-01-06 7 views
1

고유해야하는 특정 열이있는 Postgres 9.6 테이블이 있습니다. 중복 행을 삽입하려고하면 Postgres가 삽입을 무시하고 실패하거나 중단하는 대신 계속 진행하기를 원합니다. 삽입이 트랜잭션에서 랩핑되면 트랜잭션을 중단하거나 트랜잭션의 다른 갱신에 영향을 주어서는 안됩니다.Postgres는 열 제약 조건 충돌을 자동으로 무시할 수 있습니까?

나는 위에서 설명한대로 테이블을 만드는 방법이 있다고 가정하지만 아직 설명하지 못했습니다.

레일스에서 ​​어떻게하는지 보일 수 있다면 보너스 포인트가 필요합니다.

답변

4

이것은 ON CONFLICT clause for INSERT 가능합니다 : ON CONFLICT 절을

옵션은 고유 위반 또는 제외 제약 조건 위반 오류를 제기 에 대한 대안 작업을 지정합니다. 삽입을 제안하는 각 개별 행에 대해 삽입 이 진행되거나 conflict_target으로 지정된 중재자 제약 조건이나 인덱스를 위반하면 대체 conflict_action이 수행됩니다. ON CONFLICT DO NOTHING은 단순히 행을 행을 삽입하지 않으므로 대체 조치로 입니다.

이것은 비교적 새로운 기능으로 Postgres 9.5 이후 부터만 사용할 수 있지만 문제는 아닙니다.

이것은 테이블 작성시 특정 사항이 아니기 때문에 각 삽입을 수정해야합니다. 레일스와 어떻게 작동하는지 모르겠지만 적어도 이것을 수행하기 위해서는 쿼리의 일부를 수동으로 작성해야 할 것입니다.

이 기능은 종종 UPSERT라고도하며,이를 위해 레일스에서 ​​통합 된 방법을 찾고자 할 때 검색하는 것이 더 좋습니다.