SQLite:在一个语句中组合SELECT和DELETE

时间:2009-10-14 04:30:22

标签: sql sqlite

我需要像这样运行两个语句:

Select amount from db where ID=5
DELETE from db where ID=5

目前,我准备并运行两个不同的陈述。我想知道是否有办法将其合并为一个陈述。

基本上我需要做的就是在删除之前从行中获取一个数量列。

4 个答案:

答案 0 :(得分:12)

SQLite不支持对标准SQL的此扩展 - 您必须同时使用两个语句,SELECT首先,DELETE下一个。当然,您可以将它们包装在事务中(BEGIN和COMMIT语句之前和之后将保证),以保证原子性和一致性。

答案 1 :(得分:1)

假设你的调用线程/进程有一个唯一的标识符(例如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>;

不确定它与交易相比会如何表现但却无法想到它会在哪些方面变得更糟(甚至可能更好),并且使用这种方法,代码看起来就像你能得到的一样简单。与事务不同,它不会要求您在事务失败的情况下循环,以确保处理最近SELECT时表中的所有未完成元素。

答案 2 :(得分:0)

已经很晚了,但是对于未来的访客。就我而言,我喜欢下面的情况

我想删除数量= 5的那个ID,所以我这样做了

FIFOqueue
  

因此,在您的情况下,您需要修改所需的条件

答案 3 :(得分:-2)

您可以通过用分号分隔两个语句来完成此操作,例如: (使用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]);
      }
    }
  }
}