foreign - Instrucción "Insertar si no existe" en SQLite
sqlite insert or update (5)
Para una columna única, usa esto:
INSERT OR REPLACE INTO table () values();
Para obtener más información, consulte: sqlite.org/lang_insert
Tengo una base de datos SQLite. Estoy intentando insertar valores ( users_id
, lessoninfo_id
) en bookmarks
tabla, solo si ninguno de ellos existe antes en una fila.
INSERT INTO bookmarks(users_id,lessoninfo_id)
VALUES(
(SELECT _id FROM Users WHERE User=''"+$(''#user_lesson'').html()+"''),
(SELECT _id FROM lessoninfo
WHERE Lesson="+lesson_no+" AND cast(starttime AS int)="+Math.floor(result_set.rows.item(markerCount-1).starttime)+")
WHERE NOT EXISTS (
SELECT users_id,lessoninfo_id from bookmarks
WHERE users_id=(SELECT _id FROM Users
WHERE User=''"+$(''#user_lesson'').html()+"'') AND lessoninfo_id=(
SELECT _id FROM lessoninfo
WHERE Lesson="+lesson_no+")))
Esto da un error al decir:
db error cerca de donde la sintaxis.
Si no desea tener duplicados, debe declarar esto como una restricción de tabla:
CREATE TABLE bookmarks(
users_id INTEGER,
lessoninfo_id INTEGER,
UNIQUE(users_id, lessoninfo_id)
);
(Una clave principal en ambas columnas tendría el mismo efecto).
Entonces es posible decirle a la base de datos que desea ignorar silenciosamente los registros que violarían tal restricción :
INSERT OR IGNORE INTO bookmarks(users_id, lessoninfo_id) VALUES(123, 456)
Si tiene una tabla llamada memos que tiene dos columnas, id
y text
, debería poder hacer esto:
INSERT INTO memos(id,text)
SELECT 5, ''text to insert''
WHERE NOT EXISTS(SELECT 1 FROM memos WHERE id = 5 AND text = ''text to insert'');
Si un registro ya contiene una fila donde el text
es igual a ''texto para insertar'' e id
es igual a 5, entonces la operación de inserción será ignorada.
No sé si esto funcionará para su consulta en particular, pero tal vez le dé una pista sobre cómo proceder.
Le aconsejaría que en su lugar diseñe su tabla para que no se permitan duplicados, como se explica en la @CLs answer
continuación.
INSERT INTO Database.dbo.Table
SELECT *
FROM Database.dbo.Table
WHERE ID not in (select ID from Database.dbo.Table)
insert into bookmarks (users_id, lessoninfo_id)
select 1, 167
EXCEPT
select user_id, lessoninfo_id
from bookmarks
where user_id=1
and lessoninfo_id=167;
Esta es la forma más rápida.
Para algunos otros motores SQL, puede usar una tabla Dummy que contiene 1 registro. p.ej:
select 1, 167 from ONE_RECORD_DUMMY_TABLE