ON CONFLICT 절
ON CONFLICT 절
이 페이지에서는 SQLite의 ON CONFLICT 절에 대해 설명합니다. 이 절은 UNIQUE, PRIMARY KEY, NOT NULL, CHECK 제약 조건 충돌이 발생했을 때 수행할 동작을 지정하는 데 사용됩니다. 이를 통해 INSERT 실행 중 충돌을 해결하거나, 데이터를 갱신하는 upsert 작업을 구현할 수 있습니다.
출처: 문서
본문
conflict-clause:
ON CONFLICT ROLLBACK ABORT FAIL IGNORE REPLACE
ON CONFLICT 절은 SQLite에만 있는 비표준 확장 기능으로, 다른 많은 SQL 명령에도 나타날 수 있습니다. 표준 SQL의 일부가 아니어서 익숙하지 않을 수 있으므로, 이 문서에서는 별도의 섹션으로 다룹니다.
여기서 설명하는 ON CONFLICT 절은 3.0.0(2004-06-18) 이전부터 SQLite에 포함되어 있었습니다. 'ON CONFLICT'이라는 표현은 3.24.0(2018-06-04)에서 INSERT에 추가된 확장 기능인 UPSERT의 일부이기도 합니다. 이 두 'ON CONFLICT' 표현이 서로 다른 용도라는 점을 혼동하지 마세요.
ON CONFLICT 절의 구문은 위에 나온 CREATE TABLE 명령의 구문과 같습니다. INSERT 및 UPDATE 명령에서는 구문이 더 자연스럽게 읽히도록 'ON CONFLICT' 키워드 대신 'OR'이 사용됩니다. 예를 들어 'INSERT ON CONFLICT IGNORE' 대신 'INSERT OR IGNORE'라고 씁니다. 키워드는 바뀌지만 절의 의미는 어느 쪽이든 동일합니다.
ON CONFLICT 절은 UNIQUE, NOT NULL, PRIMARY KEY 제약 조건에만 사용할 수 있습니다. CHECK 및 FOREIGN KEY 제약 조건에는 ON CONFLICT 절을 사용할 수 없습니다. 충돌 해결 알고리즘은 ROLLBACK, ABORT, FAIL, IGNORE, REPLACE의 다섯 가지가 있습니다. 기본 충돌 해결 알고리즘은 ABORT입니다. 각각의 의미는 다음과 같습니다.
ROLLBACK
적용되는 제약 조건 위반이 발생하면, ROLLBACK 해결 알고리즘은 SQLITE_CONSTRAINT 오류와 함께 현재 SQL 문을 중단하고 현재 트랜잭션을 롤백합니다. 활성 트랜잭션이 없다면(모든 명령에 대해 생성되는 암시적 트랜잭션 외에는) ROLLBACK 해결 알고리즘은 ABORT 알고리즘과 동일하게 작동합니다.
ABORT
적용되는 제약 조건 위반이 발생하면, ABORT 해결 알고리즘은 SQLITE_CONSTRAINT 오류로 현재 SQL 문을 중단하고 현재 SQL 문이 만든 변경 사항을 모두 되돌립니다. 그러나 같은 트랜잭션에서 이전 SQL 문들이 일으킨 변경 사항은 유지되며 트랜잭션은 계속 활성 상태로 남습니다. 이것이 기본 동작이며 SQL 표준이 지정하는 동작이기도 합니다.
FAIL
적용되는 제약 조건 위반이 발생하면, FAIL 해결 알고리즘은 SQLITE_CONSTRAINT 오류로 현재 SQL 문을 중단합니다. 그러나 FAIL 해결은 실패한 SQL 문이 이미 만든 이전 변경 사항을 되돌리지 않으며, 트랜잭션도 종료하지 않습니다. 예를 들어 UPDATE 문이 업데이트하려는 100번째 행에서 제약 조건 위반을 만나면 처음 99개 행의 변경 사항은 유지되지만 100번째 이후 행의 변경은 결코 발생하지 않습니다.
FAIL 동작은 유일성, NOT NULL 및 CHECK 제약 조건에 대해서만 작동합니다. 외래 키 제약 조건 위반이 발생하면 ABORT가 일어납니다.
IGNORE
적용되는 제약 조건 위반이 발생하면, IGNORE 해결 알고리즘은 제약 조건 위반이 있는 해당 행 하나를 건너뛰고 아무 일도 없었던 것처럼 SQL 문의 후속 행을 계속 처리합니다. 제약 조건 위반이 있는 행의 앞뒤에 있는 다른 행들은 정상적으로 삽입되거나 업데이트됩니다. IGNORE 충돌 해결 알고리즘을 사용할 때는 유일성, NOT NULL 및 UNIQUE 제약 조건 오류에 대해 오류가 반환되지 않습니다. 그러나 IGNORE 충돌 해결 알고리즘은 외래 키 제약 조건 오류에 대해서는 ABORT처럼 작동합니다.
REPLACE
UNIQUE 또는 PRIMARY KEY 제약 조건 위반이 발생하면, REPLACE 알고리즘은 현재 행을 삽입하거나 업데이트하기 전에 제약 조건 위반의 원인이 되는 기존 행들을 삭제하고 명령은 정상적으로 계속 실행됩니다. NOT NULL 제약 조건 위반이 발생하면, REPLACE 충돌 해결은 NULL 값을 해당 열의 기본값으로 대체하며, 열에 기본값이 없으면 ABORT 알고리즘이 사용됩니다. CHECK 제약 조건 또는 외래 키 제약 조건 위반이 발생하면 REPLACE 충돌 해결 알고리즘은 ABORT처럼 작동합니다.
REPLACE 충돌 해결 전략이 제약 조건을 충족시키기 위해 행을 삭제할 때, 삭제 트리거는 재귀 트리거가 활성화된 경우에만 실행됩니다.
REPLACE 충돌 해결 전략으로 삭제된 행에 대해서는 update hook이 호출되지 않습니다. 또한 REPLACE는 변경 카운터를 증가시키지 않습니다. 이 문단에 정의된 예외적 동작은 향후 릴리스에서 변경될 수 있습니다.
INSERT 또는 UPDATE의 OR 절에 지정된 알고리즘은 CREATE TABLE에 지정된 알고리즘보다 우선합니다. 어디에도 알고리즘이 지정되지 않으면 ABORT 알고리즘이 사용됩니다.
이 페이지는 2025-11-22 13:15:11Z에 마지막으로 업데이트되었습니다.