INSERTAR SI NO EXISTE ¿OTRA COSA ACTUALIZAR?

Resuelto SparkyNZ asked hace 14 años • 9 respuestas

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?

SparkyNZ avatar Sep 03 '10 17:09 SparkyNZ
Aceptado

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 IDcolumna: 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 Seenen 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"));
janm avatar Sep 03 '2010 10:09 janm

Debe utilizar el INSERT OR IGNOREcomando seguido de un UPDATEcomando: En el siguiente ejemplo namese 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)

moshik avatar Dec 01 '2013 09:12 moshik

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.

Anna Bucher avatar Jan 27 '2011 10:01 Anna Bucher