En SQLite, cuando intenta insertar varias filas en una tabla y cualquiera de esas filas viola una restricción en esa tabla, la operación fallará.
Esto es de esperar, después de todo, para eso está la restricción.
Pero, ¿qué sucede si solo desea ignorar las filas que violan las restricciones? En otras palabras, si una fila viola una restricción, desea que SQLite omita esa fila, luego continúe procesando la fila siguiente, y así sucesivamente.
Afortunadamente, hay una manera fácil de hacer esto en SQLite.
La cláusula ON CONFLICT
SQLite tiene el ON CONFLICT
cláusula que le permite especificar cómo manejar los conflictos de restricciones. Más específicamente, se aplica a UNIQUE
, NOT NULL
, CHECK
y PRIMARY KEY
restricciones (pero no FOREIGN KEY
restricciones).
El ON CONFLICT
la cláusula se usa en CREATE TABLE
declaraciones, pero al insertar datos, la cláusula se reemplaza con OR
.
Por lo tanto, puede usar esta cláusula para determinar cómo manejar las violaciones de restricciones al insertar datos.
Hay cinco valores posibles que puede usar con esta cláusula:
ROLLBACK
ABORT
FAIL
IGNORE
REPLACE
A los efectos de este artículo, utilizaremos IGNORE
opción.
Usando IGNORE
hace que SQLite omita la única fila que contiene la violación de la restricción y continúe procesando las filas subsiguientes como si nada hubiera salido mal.
Ejemplo
Aquí hay una CREATE TABLE
instrucción para una tabla llamada Productos :
CREATE TABLE Products(
ProductId INTEGER PRIMARY KEY,
ProductName NOT NULL,
Price
);
Tenga en cuenta que esta tabla incluye un NOT NULL
restricción en ProductName columna.
Ahora intentemos insertar datos que violen esa restricción.
INSERT INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Resultado:
Error: NOT NULL constraint failed: Products.ProductName
No en vano, obtenemos un error que indica que NOT NULL
se violó la restricción.
Ahora veamos cuántas filas se insertaron en la tabla.
SELECT COUNT(*) FROM Products;
Resultado:
0
Entonces sabemos que solo la segunda fila violó la restricción, pero esto evitó que cualquier que se inserten datos.
Podemos cambiar esto agregando OR IGNORE
a nuestro INSERT
declaración:
INSERT OR IGNORE INTO Products VALUES
(1, 'Widget Holder', 139.50),
(2, NULL, 11.00),
(3, 'Widget Stick', 89.75);
Eso es todo lo que se requiere. Ejecutar este código no da como resultado un error como el código anterior. Al ejecutar este código, se insertan los datos correctos y se ignoran los datos incorrectos.
Ahora si ejecutamos un SELECT
contra la tabla, podemos ver que los datos correctos se insertaron de hecho.
SELECT * FROM Products;
Resultado:
ProductId ProductName Price ---------- ------------- ---------- 1 Widget Holder 139.5 3 Widget Stick 89.75