Pertanyaan Pernyataan "Masukkan jika tidak ada" dalam SQLite


Saya memiliki database SQLite. Saya mencoba memasukkan nilai (users_id, lessoninfo_id) di meja bookmarks, hanya jika keduanya tidak ada sebelumnya berturut-turut.

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

Ini memberikan kesalahan yang mengatakan:

kesalahan db dekat di mana sintaks.


75
2017-10-12 17:19


asal


Jawaban:


Jika Anda memiliki tabel yang disebut memo yang memiliki dua kolom id dan text Anda harus bisa melakukan seperti ini:

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

Jika catatan sudah berisi baris di mana text sama dengan 'teks untuk dimasukkan' dan id sama dengan 5, maka operasi insert akan diabaikan.

Saya tidak tahu apakah ini akan bekerja untuk permintaan khusus Anda, tetapi mungkin itu memberi Anda petunjuk tentang cara melanjutkan.

Saya akan menyarankan bahwa Anda malah mendesain meja Anda sehingga tidak ada duplikat yang diizinkan seperti yang dijelaskan di @CLs answer di bawah.


79
2017-10-12 17:38



Jika Anda tidak ingin memiliki duplikat, Anda harus menyatakan ini sebagai batasan tabel:

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

(Kunci utama pada kedua kolom akan memiliki efek yang sama.)

Maka mungkin untuk memberitahu database yang Anda inginkan diam-diam mengabaikan catatan yang akan melanggar batasan seperti itu:

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

324
2017-10-13 08:10



Untuk kolom unik, gunakan ini:

INSERT OR REPLACE INTO table () values();

Untuk informasi lebih lanjut, lihat: 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;

Ini adalah cara tercepat.

Untuk beberapa mesin SQL lainnya, Anda dapat menggunakan tabel Dummy yang berisi 1 catatan. misalnya:

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