SQLite의 제약 조건 충돌 해결
SQLite의 제약 조건 충돌 해결 (Constraint Conflict Resolution)
대부분의 SQL 데이터베이스에서 테이블에 UNIQUE, NOT NULL, CHECK 제약 조건이 있고 이 제약을 위반하는 UPDATE나 INSERT를 시도하면, 데이터베이스는 진행 중인 작업을 중단하고 같은 UPDATE 또는 INSERT 문과 연관된 이전 변경을 되돌린 뒤 오류를 반환해요. 이것이 SQLite의 기본 동작이지만, SQLite는 제약 조건 위반을 처리하는 대안적인 방법을 정의할 수도 있답니다.
출처: 문서
본문
대부분의 SQL 데이터베이스에서 테이블에 UNIQUE, NOT NULL, CHECK 제약 조건이 있고 그 제약을 위반하는 UPDATE나 INSERT를 시도하면, 데이터베이스는 진행 중인 작업을 중단하고 같은 UPDATE 또는 INSERT 문과 연관된 이전 변경을 백아웃(되돌림)한 뒤 오류를 반환해요. 이것이 SQLite의 기본 동작이지만, SQLite는 제약 조건 위반을 처리하는 대안적인 방법을 정의할 수도 있어요. 이 문서는 그 대안들과 사용법을 설명해요.
충돌 해결 알고리즘
SQLite는 다섯 가지 제약 조건 충돌 해결 알고리즘을 다음과 같이 정의해요.
ROLLBACK
제약 조건 위반이 발생하면 즉시 ROLLBACK이 일어나서 현재 트랜잭션이 끝나고, 명령은 SQLITE_CONSTRAINT 반환 코드와 함께 중단돼요. 활성 트랜잭션이 없으면(모든 명령에 생성되는 암시적 트랜잭션 외에) 이 알고리즘은 ABORT와 동일하게 동작해요.
ABORT
제약 조건 위반이 발생하면 명령은 이전에 만들었을 수 있는 변경을 백아웃하고 SQLITE_CONSTRAINT 반환 코드와 함께 중단돼요. 하지만 ROLLBACK은 실행되지 않으므로 같은 트랜잭션 내에서 이전 명령들이 만든 변경은 보존돼요. 이것이 SQLite의 기본 동작이에요.
FAIL
제약 조건 위반이 발생하면 명령은 SQLITE_CONSTRAINT 반환 코드와 함께 중단돼요. 하지만 명령이 제약 조건 위반을 만나기 전에 데이터베이스에 만든 변경은 보존되고 백아웃되지 않아요. 예를 들어 UPDATE 문이 업데이트하려는 100번째 행에서 제약 조건 위반을 만나면, 처음 99개 행의 변경은 보존되지만 100번째 이후 행의 변경은 절대 일어나지 않아요.
IGNORE
제약 조건 위반이 발생하면 위반을 포함한 그 한 행만 삽입되거나 변경되지 않아요. 하지만 명령은 정상적으로 계속 실행돼요. 위반을 포함한 행 앞뒤의 다른 행들은 계속 정상적으로 삽입되거나 업데이트돼요. 오류는 반환되지 않아요.
REPLACE
UNIQUE 제약 조건 위반이 발생하면, 위반을 일으킨 기존 행이 현재 행을 삽입하거나 업데이트하기 전에 제거돼요. 따라서 삽입이나 업데이트는 항상 일어나요. 명령은 정상적으로 계속 실행되고 오류는 반환되지 않아요.