sql >> Base de Datos >  >> RDS >> SQLite

Cómo omitir filas que violan restricciones al insertar datos en SQLite

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