SQLite: combina SELECT y DELETE en una statement

Necesito ejecutar dos declaraciones como estas:

 Seleccione cantidad desde db donde ID = 5
 ELIMINAR desde db donde ID = 5

Actualmente preparo y manejo dos declaraciones diferentes. Me pregunto si hay una manera de combinarlo en una statement.

Básicamente, todo lo que necesito hacer es get una columna de cantidad de la fila antes de que se elimine.

SQLite no admite esta extensión para SQL estándar; debe usar ambas sentencias, SELECT primero, SUPRIMIR siguiente. Puede envolverlos en una transacción, por supuesto, (las afirmaciones BEGIN y COMMIT antes y después lo garantizarán), para garantizar la atomicidad y la consistencia.

Asumiendo que su hilo / process de llamada tiene un identificador único (por ejemplo, thread_id), creo que un enfoque viable sería agregar una bandera (por ejemplo, "handlerid") a su tabla, que se establece en null en insert, y luego hacer:

update db set handlerid = <my_thread_id> where handlerid is null; select * from db where handlerid is not null and handlerid = <my_thread_id>; delete from db where handlerid is not null and handlerid = <my_thread_id>; 

No estoy seguro de cómo se llevaría a cabo frente a una transacción, pero no se puede pensar en ninguna razón que sería materialmente peor (incluso podría ser mejor), y utilizando este enfoque, el código parece tan sencillo como se puede get. a diferencia de una transacción, no será necesario que realice un bucle en el caso de que una transacción falle, para asegurarse de que todos los elementos pendientes que estaban en la tabla en el momento del SELECT más reciente hayan sido procesados.

Puede hacer esto separando las dos declaraciones con un punto y coma, por ejemplo (usando el puerto .NET de SQLite):

 using (SQLiteConnection conn = new SQLiteConnection("Data Source=fie.db3")) { conn.Open(); using (var cmd = conn.CreateCommand()) { cmd.CommandText = "SELECT id FROM fies; DELETE FROM fies WHERE id = 5;"; using (var reader = cmd.ExecuteReader()) { while (reader.Read()) { Console.WriteLine(reader[0]); } } } }