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 が過去のものか、insert ステートメントのものか分からないことです。このクエリを安全に書くにはどうすればよいですか

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));

制約の 1 つに違反している行を無視するようになりました

INSERT OR IGNORE INTO thread (section, subject, body)
VALUES (1, 'Subject1', 'Body1');

挿入が成功LAST_INSERT_ROWID()すると、挿入された行の ID が返されますが、重複していsectionsubject挿入が失敗した場合は、 が返され0ます。

于 2013-08-20T22:01:58.433 に答える