Frage "Insert if not exists" -Anweisung in SQLite


Ich habe eine SQLite-Datenbank. Ich versuche Werte einzufügen (users_id, lessoninfo_id) in der Tabelle bookmarks, nur wenn beide vorher nicht existieren.

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

Dies gibt einen Fehler, der besagt:

db-Fehler in der Nähe der Syntax.


75
2017-10-12 17:19


Ursprung


Antworten:


Wenn Sie eine Tabelle namens Memos mit zwei Spalten haben id und text Sie sollten in der Lage sein, so zu tun:

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

Wenn ein Datensatz bereits eine Zeile enthält, text ist gleich 'einzufügender Text' und id ist gleich 5, dann wird die Einfügeoperation ignoriert.

Ich weiß nicht, ob das für Ihre spezielle Abfrage funktioniert, aber vielleicht gibt es Ihnen einen Hinweis darauf, wie es weitergeht.

Ich würde empfehlen, dass Sie stattdessen Ihre Tabelle so entwerfen, dass keine Duplikate wie in erklärt erlaubt sind @CLs answer unten.


79
2017-10-12 17:38



Wenn Sie keine Duplikate haben möchten, sollten Sie dies als Tabellenbeschränkung deklarieren:

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

(Ein Primärschlüssel über beide Spalten würde den gleichen Effekt haben.)

Es ist dann möglich, der Datenbank mitzuteilen, dass Sie möchten ignorieren Sie Datensätze, die eine solche Einschränkung verletzen würden:

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

324
2017-10-13 08:10



Verwenden Sie für eine eindeutige Spalte Folgendes:

INSERT OR REPLACE INTO table () values();

Weitere Informationen finden Sie unter: sqlite.org/lang_insert


3
2017-12-20 10:10



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;

Dies ist der schnellste Weg.

Für einige andere SQL-Engines können Sie eine Dummy-Tabelle mit 1 Datensatz verwenden. z.B:

select 1, 167 from ONE_RECORD_DUMMY_TABLE

2
2018-06-01 11:46



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

-2
2018-04-03 05:41