ON CONFLICT
La cláusula ON CONFLICT no es una sentencia SQL. Es una cláusula no estándar que puede aparecer en muchas otras sentencias SQL. Tiene su propia sección en este documento porque no es parte del SQL estándar y puede que no resulte familiar.
La sintaxis de la cláusula ON CONFLICT que se muestra arriba es para la sentencia CREATE TABLE. Para las sentencias INSERT y UPDATE, las palabras clave "ON CONFLICT" se reemplazan por "OR" de modo que se leen de forma más natural. Por ejemplo, el lugar de "INSERT ON CONFLICT IGNORE" usaremos "INSERT OR IGNORE". La palabra clave cambia, pero el significado de la cláusula es el mismo de las dos formas.
La cláusula ON CONFLICT se aplica a las restricciones UNIQUE y NOT NULL (y a las restricciones PRIMARY KEY que para el propósito de esta sección es lo mismo que las restricción UNIQUE). El algoritmo de ON CONFLICT no se aplica a restricciones FOREIGN KEY. Existen cinco opciones de algoritmos de resolución de conflictos: ROLLBACK, ABORT, FAIL, IGNORE y REPLACE. El algoritmo por defecto es ABORT. Esto es lo que significa cada uno:
- ROLLBACK
Cuando se produce la violación de restricción aplicable, el algoritmo de resolución ROLLBACK aborta la sentecia SQL actual con un error SQLITE_CONSTRAINT y retrocede la transacción actual. Si no hay una transacción activa (salvo la implicada que se crea para cada comando) el algoritmo de resolución ROLLBACK funciona del mismo modo que el algoritmo ABORT.
- ABORT
Cuando se produce la violación de restricción aplicable, el algoritmo de resolución ABORT aborta la sentencia SQL actual con un error SQLITE_CONSTRAIT y deshace cualquier cambio realizado por la sentencia actual; pero los cambios producidos por sentecias SQL previas dentro de la misma transacción son preservados y la transacción permanece activa. Este es el comportamiento por defecto y el prescrito en el SQL estándar.
- FAIL
Cuando se produce la violación de restricción aplicable, el algoritmo de resolución FAIL aborta la sentencia SQL actual con un error SQLITE_CONSTRAINT. Pero la resolución FAIL no deshace cambios previos de la sentencia SQL que ha fallado ni termina la transacción. Por ejemplo, si una sentencia UPDATE produce una violación de restricción en la fila 100 que intenta actualizar, entonces las primeras 99 filas se conservan, pero los cambios de la fila 100 y siguientes nunca se producen.
- IGNORE
Cuando se produce la violación de restricción aplicable, el algoritmo de resolución IGNORE se salta la fila que contiene la violación de restricción y continúa procesando las siguientes filas de la sentencia SQL como si nada malo hubiera pasado. Otras filas antes y después de la que contiene la violación serán insertadas o actualizadas con normalidad. No se retorna ningún error cuando se usa el algoritmo de resolución de conflictos IGNORE.
- REPLACE
Cuando se produce la violación de restricción aplicable, el algoritmo de resolución REPLACE borra las filas que existían previamente y que han provocado la violación de restricción anterior a la inserción o actualización de la fila actual y la sentencia continúa ejecutándose normalmente. Si se produce una violación de restricción NOT NULL, la resolución de conflicto REPLACE reemplaza el valor NULL con el valor por defecto para esa columna, o si la columna no tiene valor por defecto, se usa al algoritmo ABORT. Si se produce la violacion de restricción CHECK, el algoritmo de resolución de conflictos REPLACE siempre funciona como ABORT.
Cuando la estrategia de resolución de conflictos REPLACE borra filas para satisfacer una restricción, los triggers de borrado se disparan si y sólo si los triggers recursivos están activados.
El gancho 'update' no es invocado para filas que son borradas por la estrategia de resolución de conflictos REPLACE. Tampoco se incremetna el contador de cambios. Los comportamientos excepcionales descritos en este párrafo pueden cambiar en versiones futuras.
El algoritmo especificado en la cláusula OR de un INSERT o UPDATE anula cualquier algoritmo especificado en CREATE TABLE. Si no se especifica ningún algoritmo en ninguna parte, se usa el algoritmo ABORT.