insertar condicionalmente obtener ID de fila?

.net dapper sql sqlite

Pregunta

Quiero crear un hilo, pero solo si el tema es único en esa sección. Entonces quiero obtener la identificación de la fila del hilo. ¿Cómo lo escribo de manera segura? Mis pensamientos eran algo así como

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

El problema es que no tengo idea si last_insert_rowid algo del pasado o de mi declaración de inserción. ¿Cómo escribo esta consulta de forma segura?

Respuesta popular

Si lo entiende correctamente, puede usar la sintaxis OR IGNORE . Para que funcione, debe tener una restricción UNIQUE en la section y el subject

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

Ahora ignorar una fila si viola una de las restricciones

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

Ahora bien, si la inserción fue LAST_INSERT_ROWID() , LAST_INSERT_ROWID() devolverá una identificación para la fila insertada, pero si fue un duplicado para la section y el subject no fue insertado, devolverá 0 .



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué