INSERTAR SI NO EXISTE ¿OTRA COSA ACTUALIZAR?
Encontré algunas soluciones "posibles" para el clásico "¿Cómo inserto un nuevo registro o actualizo uno si ya existe?", pero no puedo hacer que ninguna de ellas funcione en SQLite.
Tengo una tabla definida de la siguiente manera:
CREATE TABLE Book
ID INTEGER PRIMARY KEY AUTOINCREMENT,
Name VARCHAR(60) UNIQUE,
TypeID INTEGER,
Level INTEGER,
Seen INTEGER
Lo que quiero hacer es agregar un registro con un Nombre único. Si el Nombre ya existe, quiero modificar los campos.
¿Alguien puede decirme cómo hacer esto por favor?
Eche un vistazo a http://sqlite.org/lang_conflict.html .
Quieres algo como:
insert or replace into Book (ID, Name, TypeID, Level, Seen) values
((select ID from Book where Name = "SearchName"), "SearchName", ...);
Tenga en cuenta que cualquier campo que no esté en la lista de inserción se establecerá en NULL si la fila ya existe en la tabla. Es por eso que hay una subselección para la ID
columna: en el caso de reemplazo, la declaración la establecería en NULL y luego se asignaría una ID nueva.
Este enfoque también se puede utilizar si desea dejar valores de campo particulares solos si la fila en el caso de reemplazo pero establece el campo en NULL en el caso de inserción.
Por ejemplo, suponiendo que quiera dejarlo Seen
en paz:
insert or replace into Book (ID, Name, TypeID, Level, Seen) values (
(select ID from Book where Name = "SearchName"),
"SearchName",
5,
6,
(select Seen from Book where Name = "SearchName"));
Debe utilizar el INSERT OR IGNORE
comando seguido de un UPDATE
comando: En el siguiente ejemplo name
se muestra una clave principal:
INSERT OR IGNORE INTO my_table (name, age) VALUES ('Karen', 34)
UPDATE my_table SET age = 34 WHERE name='Karen'
El primer comando insertará el registro. Si el registro existe, ignorará el error causado por el conflicto con una clave primaria existente.
El segundo comando actualizará el registro (que ahora definitivamente existe)
Debe establecer una restricción en la tabla para desencadenar un " conflicto " que luego resuelve realizando un reemplazo:
CREATE TABLE data (id INTEGER PRIMARY KEY, event_id INTEGER, track_id INTEGER, value REAL);
CREATE UNIQUE INDEX data_idx ON data(event_id, track_id);
Entonces puedes emitir:
INSERT OR REPLACE INTO data VALUES (NULL, 1, 2, 3);
INSERT OR REPLACE INTO data VALUES (NULL, 2, 2, 3);
INSERT OR REPLACE INTO data VALUES (NULL, 1, 2, 5);
El "SELECCIONAR * DE datos" le dará:
2|2|2|3.0
3|1|2|5.0
Tenga en cuenta que data.id es "3" y no "1" porque REEMPLAZAR realiza un BORRAR e INSERTAR, no una ACTUALIZACIÓN. Esto también significa que debe asegurarse de definir todas las columnas necesarias o obtendrá valores NULL inesperados.