【发布时间】: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() 不是线程安全的。叹息..