【问题标题】:How to update and select a row within one query in SqLite?如何在 SqlLite 的一个查询中更新和选择一行?
【发布时间】:2009-12-17 13:43:39
【问题描述】:

我想在 SqlLite 的一个查询中更新并选择一行。在 MySql 中,我想要的查询如下所示:

SET @update_id := -1;
UPDATE data SET `Status` = 'running', Id = (SELECT @update_id := Id) 
  WHERE `Status` = 'scheduled' LIMIT 1;
SELECT * FROM data WHERE id=@update_id;"

上述查询会将Status设置为'running',并将变量@update_id的值设置为修改行的Id对于具有 Status 'scheduled' 的第一行,然后使用变量 @update_id 获取完整的修改行。

重点是我需要选择我已经被UPDATE语句修改过的行

但据我所知 SqlLite 不支持变量。

如何为 SqlLite 重写上面的 MySQL 查询?

【问题讨论】:

  • 你能解释一下你想在这里做什么吗?如果 Id 或 -1 如果未设置,您似乎将 Id 设置为以前的值?
  • 你的SQL其实是三个语句,不是一个。
  • @mutzel:对于并发问题,我可以建议最好是带有版本的 int 列。这意味着在做某事时需要传递 ID 和版本,但它会有效地解决并发问题。
  • 使用 OMG Ponies 答案并将 3 更改为 UPDATE DATA SET STATUS = 'running' WHERE ID = 怎么样?和状态='预定';这意味着如果其他人修改它,更新将失败。然后,您可以运行 sqlite3_total_changes() 以确保您进行了更改,但如其文档中所述 sqlite3_total_changes() 不是线程安全的。叹息..

标签: sql mysql sqlite


【解决方案1】:

你需要declare and use variables in whatever program you write that runs SQLite statements

谢天谢地,您可以使用bind variables in SQLite

//1.  Fetch the id into whatever language you are using:
SELECT id FROM DATA WHERE status = 'scheduled' LIMIT 1;

//2. Retrieve the id value from Step 1's resultset
int id = [id value from the resultset];

//3. Construct the update statement
parsed_sql_stmt stmt = parse_sql(UPDATE DATA SET STATUS = 'running' WHERE ID = ?);

//4. Execute update statement
exec_stmt(stmt, id);

//5. Select everything in the DATA table for that record
stmt = parse_sql(SELECT * FROM DATA WHERE id = ?);
exec_stmt(stmt, id);

sheepsimulator 是对的 - 这是三个独立的陈述。

【讨论】:

  • 这看起来更好,但在 1. 和 3. 之间可能会有其他人在更新同一行。我认为可以通过找出 UPDATE 语句修改了哪一行来轻松避免这种情况。
  • @mutzel:您的担忧是正确的——存储过程是一种选择,但 SQlite 不支持:sqlite.org/whentouse.html
【解决方案2】:

这个问题的答案取决于你在哪里执行代码。

如果你想在 SQLite 的命令行界面中使用变量,不,没有会话变量。你运气不好。

如果您想在通过官方 C++ API(或其他一些 API)连接到 SQLite 数据库时使用变量,则需要使用 bind variables 表示法(请参阅该页面上的 3.0)。

【讨论】:

  • 问题是我不知道UPDATE语句会提前修改的行的Id。
猜你喜欢
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多