SQLite中的“Insert if not exists”语句

yh2wf1be  于 12个月前  发布在  SQLite
关注(0)|答案(5)|浏览(162)

我有一个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 near where syntax.

xmq68pz9

xmq68pz91#

如果你永远不想有重复的,你应该把它声明为一个表约束:

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)

xzv2uavs

xzv2uavs2#

如果你有一个名为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解释的那样。

fae0ux8s

fae0ux8s3#

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

INSERT OR REPLACE INTO tableName (...) values(...);

字符串
有关更多信息,请参见:sqlite.org/lang_insert

oxiaedzo

oxiaedzo4#

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

uyhoqukh

uyhoqukh5#

对我来说,这适用于非唯一列(这里是“Name”):

CREATE TABLE InsertDemo ( ID INTEGER UNIQUE PRIMARY KEY AUTOINCREMENT, Name TEXT )
    
INSERT OR IGNORE INTO InsertDemo (ID, Name)    -- insert first row
    VALUES ( ( SELECT ID FROM InsertDemo WHERE Name = 'Miller' ), 'Miller' );    
INSERT OR IGNORE INTO InsertDemo (ID, Name)    -- but no second
    VALUES ( ( SELECT ID FROM InsertDemo WHERE Name = 'Miller' ), 'Miller' );
        
SELECT Count(ID) FROM InsertDemo;   -- returns 1

字符串

相关问题