2012-07-31 44 views
0

我在託管一個網站,可以由授權用戶添加內容。內容放置在網頁的塊內。授權用戶可以創建新塊並按特定順序放置塊。塊的順序和內容存儲在數據庫中。MySQL:插入,更新和檢查單個查詢

當新塊被創建了以下兩個MySQL查詢執行:

的順序號,數據庫內的塊的,與下面的查詢更新:

UPDATE `Block` 
SET `block_order` = `block_order` + 1 
WHERE `tab_nr` = $tab_nr 
AND `block_order` > $nr; 

新塊是通過執行以下查詢添加:

INSERT INTO `Block` 
    (`id`, `tab_nr`, `block_order`, `html`, `created`) 
VALUES 
    (NULL, $tab_nr, $nr + 1, '$html', CURRENT_TIMESTAMP); 

這些查詢的問題是,無論第二個查詢發生什麼,都會執行第一個查詢。如果第二個查詢失敗(無論原因如何),則其他塊的訂單號仍會因執行第一個查詢而更改。這樣塊順序號就搞砸了。

我需要的是一個查詢,它將新塊添加到數據庫並更新其他塊的訂單號,當且僅當存在相同編號的塊時。但問題是,我無法找到能滿足我需要的任何查詢。例如,「ON DUPLICATE KEY UPDATE」只會更新與新插入衝突的行,但在我的情況下,其他行也需要更新。對於擺脫上述問題的查詢是否有任何建議?

+2

您需要了解***事務***數據庫查詢(http://dev.mysql.com/doc/refman/5.0/en/ansi-diff-transactions.html)。 – Matt 2012-07-31 15:35:16

+1

MySQL中的[START TRANSACTION,COMMIT和ROLLBACK](http://dev.mysql.com/doc/refman/5.5/en/commit.html)語法。 – 2012-07-31 15:36:30

回答

0

您需要使用交易查詢,正如Matt在他的評論中所說的那樣。 像這樣的東西可能會有所幫助。

START TRANSACTION; 

UPDATE Block 
SET block_order = block_order + 1 
WHERE tab_nr = $tab_nr 
AND block_order > $nr; 

INSERT INTO Block 
    (id, tab_nr, block_order, html, created) 
VALUES 
    (NULL, $tab_nr, $nr + 1, '$html', CURRENT_TIMESTAMP); 

COMMIT; 

因此,即使第一個查詢失敗,整個事務也會回滾併爲您節省一團糟。