use*_*638 115 sqlite constraints sql-insert
我有一个SQLite数据库.我试图在表中插入值(users_id,lessoninfo_id),前提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+")))
Run Code Online (Sandbox Code Playgroud)
这给出了一个错误说:
db error附近的语法.
CL.*_*CL. 399
如果您从不想要重复项,则应将其声明为表约束:
CREATE TABLE bookmarks(
users_id INTEGER,
lessoninfo_id INTEGER,
UNIQUE(users_id, lessoninfo_id)
);
Run Code Online (Sandbox Code Playgroud)
(两列上的主键都会产生相同的效果.)
然后可以告诉数据库您要静默忽略违反此类约束的记录:
INSERT OR IGNORE INTO bookmarks(users_id, lessoninfo_id) VALUES(123, 456)
Run Code Online (Sandbox Code Playgroud)
Cyc*_*ode 115
如果你有一个名为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');
Run Code Online (Sandbox Code Playgroud)
如果记录已包含text等于"要插入的文本"且id等于5的行,则将忽略插入操作.
我不知道这是否适用于您的特定查询,但它可能会提示您如何继续.
我建议您改为设计表格,以便不允许重复,@CLs answer如下所述.
Ali*_*eri 16
对于唯一列,请使用以下命令:
INSERT OR REPLACE INTO table () values();
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅:sqlite.org/lang_insert
小智 7
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;
Run Code Online (Sandbox Code Playgroud)
这是最快的方法。
对于某些其他 SQL 引擎,您可以使用包含 1 条记录的虚拟表。例如:
select 1, 167 from ONE_RECORD_DUMMY_TABLE
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
134858 次 |
| 最近记录: |