在SQLite中插入“如果不存在”语句

我有一个SQLite数据库。 我试图插入值( users_idusers_id )在表bookmarks ,只有如果两个不存在之前连续。

 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+"))) 

这给了一个错误说:

db语法附近的错误。

如果你有一个名为备忘录的表,它有两列idtext你应该可以这样做:

 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'); 

如果一个logging已经包含一行,其中text等于'要插入的文本', id等于5,那么插入操作将被忽略。

我不知道这是否适用于您的特定查询,但也许会给您提示如何继续。

如果你永远不想有重复,你应该声明这是一个表约束:

 CREATE TABLE bookmarks( users_id INTEGER, lessoninfo_id INTEGER, UNIQUE(users_id, lessoninfo_id) ); 

(两列上的主键将具有相同的效果。)

然后可以告诉数据库你想默默地忽略违反这样一个约束的logging :

 INSERT OR IGNORE INTO bookmarks(users_id, lessoninfo_id) VALUES(123, 456) 
 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; 

这是最快的方法。

对于其他一些SQL引擎,可以使用包含1条logging的Dummy表。 例如:

 select 1, 167 from ONE_RECORD_DUMMY_TABLE 
 INSERT INTO Database.dbo.Table SELECT * FROM Database.dbo.Table WHERE ID not in (select ID from Database.dbo.Table)