有条件地插入行ID?

时间:2013-08-20 16:52:48

标签: .net sql sqlite dapper

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

1 个答案:

答案 0 :(得分:1)

如果理解正确,您可以使用OR IGNORE语法。为了使其发挥作用,您必须在UNIQUEsection

上设置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