2012-08-24 5 views
38

Estoy tratando de insertar datos en una tabla. Me gustaría insertar la fila si la columna ya no tiene los datos, independientemente de las otras columnas.sqlite - Cómo obtener INSERT O IGNORE para trabajar

CREATE TABLE t (
    id   INTEGER PRIMARY KEY, 
    name  VARCHAR, 
    other  INT 
); 
INSERT OR IGNORE INTO t (name) VALUES ('a'); 
INSERT OR IGNORE INTO t (name) VALUES ('a'); 
INSERT OR IGNORE INTO t (name) VALUES ('a'); 

Con el fragmento de arriba termino con 3 filas, no 1 como hubiera pensado. Si importa que el sql real esté sucediendo dentro de un disparador INSTEAD OF INSERT, este es solo un caso de prueba simple.

Respuesta

65

Reemplazar

CREATE TABLE t (
    id   INTEGER PRIMARY KEY, 
    name  VARCHAR, 
    other  INT 
); 

con

CREATE TABLE t (
    id   INTEGER PRIMARY KEY, 
    name  VARCHAR UNIQUE, 
    other  INT 
); 

por lo que recibirá

sqlite> CREATE TABLE t (
    ...>  id   INTEGER PRIMARY KEY, 
    ...>  name  VARCHAR UNIQUE, 
    ...>  other  INT 
    ...>); 
sqlite> INSERT OR IGNORE INTO t (name) VALUES ('a'); 
sqlite> INSERT OR IGNORE INTO t (name) VALUES ('a'); 
sqlite> INSERT OR IGNORE INTO t (name) VALUES ('a'); 
sqlite> select * from t ; 
1|a| 
9

Eso sólo funcionaría para el campo clave principal o restricciones únicas:

La cláusula de conflicto opcional permite la especificación de un algoritmo alternativo de resolución de conflictos de restricción para usar durante este comando INSERT.

adicional:

La cláusula se aplica a ON CONFLICT único y no limitaciones NULL (y a restricciones PRIMARY KEY que a los efectos de esta sección son la misma cosa limitaciones como único). El algoritmo ON CONFLICT no se aplica a las restricciones FOREIGN KEY. Hay cinco opciones de algoritmo de resolución de conflictos : ROLLBACK, ABORT, FAIL, IGNORE y REPLACE. El algoritmo de resolución de conflictos predeterminado es ABORTAR.

Cuestiones relacionadas