SQLite:在一条语句中组合SELECT和DELETE
我需要这样运行两个语句: Select amount from db where ID=5 DELETE from db where ID=5 目前,我准备并运行两个不同的语句。我想知道是否有一种方法可以把它合并到一个声明中SQLite:在一条语句中组合SELECT和DELETE,sql,sqlite,Sql,Sqlite,我需要这样运行两个语句: Select amount from db where ID=5 DELETE from db where ID=5 目前,我准备并运行两个不同的语句。我想知道是否有一种方法可以把它合并到一个声明中 基本上,我需要做的就是在删除该行之前从该行中获取一个amount列。SQLite不支持对标准SQL的此扩展-您必须同时使用这两个语句,先选择,然后删除。您可以将它们包装在事务中,当然,前后的BEGIN和COMMIT语句将保证这一点,以保证原子性和一致性。您可以通过使用分号分
基本上,我需要做的就是在删除该行之前从该行中获取一个amount列。SQLite不支持对标准SQL的此扩展-您必须同时使用这两个语句,先选择,然后删除。您可以将它们包装在事务中,当然,前后的BEGIN和COMMIT语句将保证这一点,以保证原子性和一致性。您可以通过使用分号分隔两条语句来实现这一点,例如使用SQLite的.NET端口:
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]);
}
}
}
}
假设您的调用线程/进程具有唯一标识符,例如thread_id,我认为一种可行的方法是向表中添加一个标记,例如handlerid,该标记在插入时设置为null,然后执行以下操作:
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>;
不确定与事务相比它将如何执行,但想不出任何原因它会变得更糟,甚至可能更好,并且使用这种方法,代码似乎尽可能简单明了。与事务不同,它不需要在事务失败的情况下循环,以确保在最近一次选择时表中所有未完成的元素都已处理。时间已晚,但供将来的访问者使用。就我而言,我确实喜欢下面的内容 我想删除amount=5的ID,所以我这样做了 所以,在您的情况下,您需要根据需要修改where条件
我可能错了,但我认为你错不了。由于删除操作可能会删除您试图获取的信息,因此无法将它们转换为单个更改。这会破坏数据库的完整性,只需执行一条语句,然后执行另一条。它并没有使它原子化。另一个进程可以在SELECT和DELETE之间修改数据库。防止这种情况发生的唯一方法是将它们包装在事务中。我尝试了非事务性的组合语句,并在SQLite管理器中运行Firefox的附加组件。这就是我所拥有的:从id=5的表格中选择金额;从id=5的fies中删除;命令已执行,行已删除,但没有从combined语句返回任何内容。ItemEnt忘记添加:这是针对iPhone嵌入式SQLite的,因此这可能与combine语句有所不同。可以吗?利昂:是的,这可能是实现上的不同。我用SQLite.NET测试了它;它肯定会返回SELECT there的结果。finnw:所以将它们包装在一个事务中:conn.BeginTransaction。拥有事务并不会阻止您使用组合SQL语句。
public void selectAndDelete() {
try {
SQLiteDatabase db = this.getWritableDatabase();
int i=db.delete(table_name, "ID = (select ID from table_name where amount = 5)", null);
if(i>0)
{
// I'm inserting here new record
}
} catch (SQLException e) {
}
}