我想创建一个线程,但前提是该主题在该部分中是唯一的。然后我想得到线程的行ID。我该如何安全地写它?我的想法就像
connection.Query<long>(@"insert into thread(section, subject, body)
select @section,@subject,@body
where not exists in (select 1 from thread where section=@section and subject=@subject;
select last_insert_rowid()", new {...}).First();
问题是我不知道last_insert_rowid来自过去或插入语句的内容。如何安全地编写此查询
答案 0 :(得分:1)
如果理解正确,您可以使用OR IGNORE
语法。为了使其发挥作用,您必须在UNIQUE
和section
subject
约束
CREATE TABLE thread
(id INTEGER PRIMARY KEY,
section INT,
subject TEXT(128),
body TEXT(256),
UNIQUE (section, subject));
现在忽略一行违反其中一个约束
INSERT OR IGNORE INTO thread (section, subject, body)
VALUES (1, 'Subject1', 'Body1');
现在,如果插入成功,那么LAST_INSERT_ROWID()
将返回插入行的ID,但如果它是section
的重复且subject
插入失败,则会返回0