202

SQLite データベースがあります。users_id値 ( , lessoninfo_id) を tableに挿入しようとしていますbookmarksが、両方が前に連続して存在しない場合にのみです。

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

これにより、次のエラーが表示されます。

where構文の近くでdbエラーが発生しました。

4

4 に答える 4

551

重複したくない場合は、これをテーブル制約として宣言する必要があります。

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)
于 2013-10-13T08:10:18.270 に答える
191

id2 つの列を持つ memos というテーブルがあり、次のtextように実行できる場合:

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

于 2013-10-12T17:38:06.723 に答える