2009-12-17 33 views
4

我想在SqLite的一個查詢中更新並選擇一行。在MySQL我想要的查詢應該是這樣的:如何在SqLite的一個查詢中更新並選擇一行?

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

上面的查詢將設置狀態到「跑步」和變量的價值@update_id到修改行的標識爲第一行有狀態'預定',並使用變量@update_id來獲取完整的修改行。

重要的一點是,我需要選擇該行,我一直UPDATE語句

修改,但據我所知SQLite不支持的變量。

如何從上面的MySQL查詢重寫爲SqLite?

+0

你能解釋一下你想要在這裏做什麼嗎? 如果Id或-1沒有設置,你的設置Id似乎是以前的值? – MindStalker 2009-12-17 14:33:55

+1

你的SQL實際上是三個語句,而不是一個。 – 2009-12-17 14:58:23

+0

@mutzel:對於併發問題,我可以建議的最好是帶有版本的int列。這意味着需要在做某事時傳遞ID和版本,但它會有效地阻止併發問題。 – 2009-12-17 17:04:33

回答

3

您需要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是正確的 - 這是三個獨立的語句。

+0

這看起來更好,但會有一個機會,在1和3之間。別人正在更新同一行。我認爲這可以通過找出UPDATE語句修改了哪一行來輕鬆避免。 – Martin 2009-12-17 16:57:37

+1

@mutzel:您的擔心是有效的 - 存儲過程將是一個選項,但SQlite不支持:http://www.sqlite.org/whentouse.html – 2009-12-17 17:02:22

1

答案取決於你在哪裏執行代碼。

如果要在SQLite的命令行界面中使用變量,則不會有會話變量。你那裏運氣不好。

如果您想在通過官方C++ API(或其他API)連接到SQLite數據庫時使用變量,則需要使用bind variables表示法(請參閱該頁上的3.0)。

+0

問題是我不知道Id的行將被UPDATE語句提前修改。 – Martin 2009-12-17 16:07:24

相關問題