Cómo hacer SI NO EXISTE en SQLite

80

Estoy intentando portar esta línea de MS SQL Server a SQLite

IF NOT EXISTS(SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received') 
    INSERT INTO EVENTTYPE (EventTypeName) VALUES ('ANI Received');

Parece que SQLite no es compatible con SI NO EXISTE o al menos no puedo hacer que funcione. ¿Me estoy perdiendo algo simple? ¿Existe alguna solución?

AngryHacker
fuente

Respuestas:

120

¿Qué tal esto?

INSERT OR IGNORE INTO EVENTTYPE (EventTypeName) VALUES 'ANI Received'

(No probado porque no tengo SQLite ... sin embargo, este enlace es bastante descriptivo).

Además, esto también debería funcionar:

INSERT INTO EVENTTYPE (EventTypeName)
SELECT 'ANI Received'
WHERE NOT EXISTS (SELECT 1 FROM EVENTTYPE WHERE EventTypeName = 'ANI Received');
playa
fuente
14
Gracias. Sin embargo, debe tenerse en cuenta que INSERT OR IGNORE piece solo funciona si EventTypeName está configurado como único.
AngryHacker
2
Cierto. Supuse que era único dado cómo se usó en el SQL de muestra. De lo contrario, se debe utilizar el segundo método.
playa
¿Se puede utilizar realmente el segundo método si EventTypeName no es único? Estoy tratando de hacer algo similar y encuentro que la cláusula SELECT WHERE NOT EXISTS está devolviendo varias filas, de hecho, cada fila donde (el equivalente de) EventTypeName! = 'ANI Received' es verdadero.
Michael
La intención es que EventTypeName sea único. El nuevo valor 'ANI recibido' solo se inserta en la tabla EVENTTYPE si aún no existe en la tabla. Aquí es donde entra WHERE NOT EXISTS. La cláusula SELECT WHERE NOT EXISTS solo puede devolver una sola fila; no hay una cláusula FROM; no hay forma de que se puedan devolver varias filas. Espero que esto lo aclare.
playa
1
Este es un estilo de codificación muy malo. ¡Con cada error, la consulta fallará silenciosamente! De los documentos: IGNOREcuando se produce una infracción de restricción aplicable, el algoritmo de resolución IGNORAR omite la fila que contiene la infracción de restricción y continúa procesando las filas posteriores de la declaración SQL como si nada hubiera salido mal. Otras filas antes y después de la fila que contenía la infracción de restricción se insertan o actualizan normalmente. No se devuelve ningún error cuando se utiliza el algoritmo de resolución de conflictos IGNORE.
ManuelSchneid3r
12

Si desea ignorar la inserción de un valor existente, debe haber un campo Clave en su Tabla. Simplemente cree una tabla con el campo de clave principal como:

CREATE TABLE IF NOT EXISTS TblUsers (UserId INTEGER PRIMARY KEY, UserName varchar(100), ContactName varchar(100),Password varchar(100));

Y luego inserte o reemplace / inserte o ignore la consulta en la tabla como:

INSERT OR REPLACE INTO TblUsers (UserId, UserName, ContactName ,Password) VALUES('1','UserName','ContactName','Password');

No permitirá que vuelva a ingresar el valor de clave principal existente ... Así es como puede verificar si un valor existe en la tabla o no.

El decano
fuente
1

También puede establecer una restricción en una tabla con los campos CLAVE y establecer en conflicto "Ignorar"

Cuando se produce una infracción de restricción aplicable, el algoritmo de resolución IGNORAR omite la fila que contiene la infracción de restricción y continúa procesando las filas posteriores de la instrucción SQL como si nada hubiera salido mal. Otras filas antes y después de la fila que contenía la infracción de restricción se insertan o actualizan normalmente. No se devuelve ningún error cuando se utiliza el algoritmo de resolución de conflictos IGNORE.

Documentación de SQLite

1lb3r
fuente