首页 文章

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

提问于
浏览
84

我有一个SQLite数据库 . 我试图在表 bookmarks 中插入值( users_idlessoninfo_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+")))

这给出了一个错误说:

db error where where syntax .

4 回答

  • 90

    如果你有一个名为memos的表,它有两列 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');
    

    如果记录已包含 text 等于'text to insert'且 id 等于5的行,则将忽略插入操作 .

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

    我建议您改为设计表格,以便不允许重复,如下面@CLs answer中所述 .

  • 341

    如果您从不想要重复项,则应将其声明为表约束:

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

    (两列上的主键都会产生相同的效果 . )

    然后可以告诉数据库你想要silently ignore records that would violate such a constraint

    INSERT OR IGNORE INTO bookmarks(users_id, lessoninfo_id) VALUES(123, 456)
    
  • 6

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

    INSERT OR REPLACE INTO table () values();
    

    有关更多信息,请参阅:sqlite.org/lang_insert

  • 2
    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条记录的Dummy表 . 例如:

    select 1, 167 from ONE_RECORD_DUMMY_TABLE
    

相关问题