Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite:在一条语句中组合SELECT和DELETE_Sql_Sqlite - Fatal编程技术网

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

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语句将保证这一点,以保证原子性和一致性。您可以通过使用分号分

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

Select amount from db where ID=5 DELETE from db where ID=5 目前,我准备并运行两个不同的语句。我想知道是否有一种方法可以把它合并到一个声明中


基本上,我需要做的就是在删除该行之前从该行中获取一个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) {

        }
    }