2013-08-20 7 views
0

Я хочу создать поток, но только если объект уникален в этом разделе. Затем я хочу получить идентификатор строки потока. Как мне безопасно написать? Мои мысли были что-то вродеВставить условно получить строку id?

connection.Query<long>(@"insert into thread(section, subject, body) 
    select @section,@subject,@body 
    where not exists in (select 1 from thread where [email protected] and [email protected]; 
    select last_insert_rowid()", new {...}).First(); 

Проблема в том, я понятия не имею, если last_insert_rowid что-то из прошлого или из моей вставки заявления. Как написать этот запрос безопасно

+0

Боюсь, я не могу помочь на фронте SQLite. Если вам нужен SQL-запрос, я могу посоветовать на любой dapper. –

+0

@MarcGravell: Я думал, что будет какой-то sql-idiom для условного ввода/возврата id. Я шокирован, никто не ответил. Я знаю, что sqlite заблокирует значения, которые я читаю, если они находятся в транзакции. Думаю, я сделаю несколько запросов/запустил –

ответ

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() вернется идентификатор для вставленной строки, но если это был дубликат для section и subject вставка не удалась, он вернет 0.

+0

Неправильно. Похоже, что моя «вставка или игнорирование в ...; выберите last_insert_rowid() 'return 1 вместо 0. У меня есть уникальная запись, которая помешала вставке, но она не вернула 0. –

+0

Это означает, что я предположил, что вы сначала сделали успешную вставку в том же сеансе, а затем вторую игнорировали , Теперь для преодоления этого предположения было бы хранить значение 'LAST_INSERT_ROWID()' перед вставкой, после того как вставить его снова и сравнить с сохраненным значением. Если текущее значение больше, чем затем, то у вас есть успешная вставка и новый идентификатор. BTW вы не можете использовать multi-insert. Вы должны выпустить один оператор вставки за раз. – peterm