update - sqlite3 sql




SQLite中的“插入如果不存在”語句 (4)

我有一個SQLite數據庫。 我試圖在表格bookmarks插入值( users_idusers_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語法附近的錯誤。


如果你有一張名為備忘錄的表,它有兩列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等於'要插入的文本'並且id等於5,那麼插入操作將被忽略。

我不知道這是否適用於您的特定查詢,但也許會給您提示如何繼續。

我會建議你改為設計你的表,以便不允許重複,正如@CLs answer下面的@CLs answer所解釋的。


如果你永遠不想重複,你應該聲明這是一個表約束:

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

(兩列上的主鍵都具有相同的效果。)

然後可以告訴數據庫你想默默地忽略違反這種約束的記錄

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

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;

這是最快的方法。

對於其他一些SQL引擎,可以使用包含1條記錄的Dummy表。 例如:

select 1, 167 from ONE_RECORD_DUMMY_TABLE




sql-insert