insérer conditionnellement obtenir l'identifiant de la ligne?

.net dapper sql sqlite

Question

Je veux créer un thread mais seulement si le sujet est unique dans cette section. Ensuite, je veux obtenir l'identifiant de ligne du thread. Comment puis-je l'écrire en toute sécurité? Mes pensées étaient quelque chose comme

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

Le problème est que je ne sais pas si last_insert_rowid est quelque chose du passé ou de mon instruction d'insertion. Comment écrire cette requête en toute sécurité

Réponse populaire

Si vous le comprenez correctement, vous pouvez utiliser la syntaxe OR IGNORE . Pour que cela fonctionne, vous devez avoir une contrainte UNIQUE sur la section et le subject

CREATE TABLE thread
(id INTEGER PRIMARY KEY, 
 section INT, 
 subject TEXT(128), 
 body TEXT(256),
 UNIQUE (section, subject));

Maintenant, pour ignorer une ligne si elle viole une des contraintes

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

Maintenant, si l'insertion réussit, LAST_INSERT_ROWID() retournera un identifiant pour la ligne insérée, mais s'il s'agissait d'un doublon pour la section et si l'insertion du subject échoué, elle retournera 0 .



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi