0

我想创建一个线程,但前提是主题在该部分中是唯一的。然后我想获取线程的行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 是来自过去还是来自我的插入语句。如何安全地编写此查询

4

1 回答 1

1

如果理解正确,您可以使用OR IGNORE语法。为了让它工作,你必须有一个UNIQUE约束sectionsubject

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

于 2013-08-20T22:01:58.433 回答