我有一个 SQLite 数据库。我试图在表 bookmarks
中插入值(users_id
、lessoninfo_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+")))
这给出了一个错误说:
where 语法附近的 db 错误。
如果您不想重复,则应将其声明为表约束:
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)
如果您有一个名为 memos 的表,它有两列 id
和 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
中所述。
对于唯一列,请使用:
INSERT OR REPLACE INTO tableName (...) values(...);
有关详细信息,请参阅:sqlite.org/lang_insert
Unique(col1,col2)
并且您也有 col3,它会很好地工作,因为插入或忽略将失败,这会将 col3 更新为新值。 insert or replace into my_table values('1','2','5')
替换行 '1','2','3'
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
person (id, name unique)
和cat (person_id, name unique)
,我想插入很多对(person_name, cat_name)
?ON CONFLICT IGNORE
添加到CREATE TABLE
会更方便一些