&引用;如果不存在,则插入“;SQLite中的语句

&引用;如果不存在,则插入“;SQLite中的语句,sqlite,constraints,sql-insert,Sqlite,Constraints,Sql Insert,我有一个SQLite数据库。我试图在表书签中插入值(users\u id,lessoninfo\u id),但前提是这两个值之前在一行中不存在 INSERT INTO bookmarks(users_id,lessoninfo_id) VALUES( (SELECT _id FROM Users WHERE User='"+$('#user_lesson').html()+"'), (SELECT _id FROM lessoninfo WHERE L

我有一个SQLite数据库。我试图在表
书签中插入值(
users\u id
lessoninfo\u id
),但前提是这两个值之前在一行中不存在

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+")))
这会给出一个错误,即:

在where语法附近出现db错误


如果您有一个名为memos的表,它有两列
id
text
,您应该可以这样做:

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');
如果记录已包含一行,其中
text
等于“要插入的文本”且
id
等于5,则插入操作将被忽略

我不知道这是否适用于您的特定查询,但它可能会提示您如何继续


我建议您改为设计表,以便不允许重复,如下所述。

如果您永远不希望有重复项,则应将其声明为表约束:

CREATE TABLE bookmarks(
    users_id INTEGER,
    lessoninfo_id INTEGER,
    UNIQUE(users_id, lessoninfo_id)
);
(两列上的主键具有相同的效果。)

然后可以告诉数据库您想要:

这是最快的方法

对于其他一些SQL引擎,可以使用包含1条记录的虚拟表。 e、 g:


对于唯一列,请使用以下命令:

INSERT OR REPLACE INTO table () values();

有关更多信息,请参阅:

获取新插入行或现有行的ID的最佳方法是什么,以便我可以将其插入到另一个具有外键的表中?e、 g.我有两个表
person(id,name unique)
cat(person\u id,name unique)
,我想插入很多对
(person\u name,cat\u name)
?只有通过选择查询才能读取现有行的id。但这是一个不同的问题。也许将冲突忽略上的
添加到
创建表中
会更好些handy@rightaway717“忽略”意味着什么都没有发生;这个问题与更新无关。@Hack06 Android的insert()行为不同;你应该用or替换它。这对我不起作用。它总是将insert或replace中的值('1','2')插入my_表(col1,col2);将添加多行1。我可能要补充的是,如果将约束放置到位
Unique(col1,col2)
,并且您还有col3,那么它会工作得很好,因为插入或忽略操作将失败,因为这会将col3更新为新值<代码>在my_表中插入或替换值('1','2','5')
替换行
'1','2','3'
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;
select 1, 167 from ONE_RECORD_DUMMY_TABLE
INSERT OR REPLACE INTO table () values();