2014-10-02 57 views
0

我寫了下面的查詢,在那裏我更新兩個表,但在三個不同的查詢聯合查詢作爲一個查詢優化

與查詢

條件這樣做如下:

檢查從表中的空座位這是針對「USER_ID」和更新「USER_ID」來設置

UPDATE seats SET user_id = '101', modified = NOW() WHERE book_id ='123' AND user_id = '0' LIMIT 1 

一旦seat設定更新book表用於更新時間針對book id

座椅
UPDATE books SET end_time = '$end_time', modified = NOW() WHERE id ='123'; 

再次更新seats表更新registered列1,在seat表相同book_id

UPDATE seats SET registered = '1', modified = NOW() WHERE book_id ='123'; 

我可以寫他們作爲一個優化的查詢?

回答

1

您可以加入這些表並在一個語句中執行所有更新,但是如果您只想更新一行,則不能。正如你在manual中看到的那樣,只有單表語法支持LIMIT

Single-table syntax: 

UPDATE [LOW_PRIORITY] [IGNORE] table_reference 
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... 
    [WHERE where_condition] 
    [ORDER BY ...] 
    [LIMIT row_count] 

Multiple-table syntax: 

UPDATE [LOW_PRIORITY] [IGNORE] table_references 
    SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... 
    [WHERE where_condition] 

如果您想在一個語句中組合這些查詢,因爲您擔心競爭條件,請查看事務。這樣做:

START TRANSACTION; 
UPDATE seats SET user_id = '101', modified = NOW() WHERE book_id ='123' AND user_id = '0' LIMIT 1; 
UPDATE books SET end_time = '$end_time', modified = NOW() WHERE id ='123'; 
UPDATE seats SET registered = '1', modified = NOW() WHERE book_id ='123'; 
COMMIT; 

這可以確保,或者這個塊中的所有語句成功或沒有。如果最後一個失敗,那麼以前的失敗會得到回滾。他們被視爲一個聲明,閱讀更多關於這here。先決條件是,您使用能夠進行事務的存儲引擎,如InnoDB。另外請確保,您使用適當的isolation level