我编写了以下查询,我在更新两个表但在三个不同的查询中执行此操作
查询条件如下:
检查表格中的空座位是否反对" 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';
我可以将它们写成一个优化查询吗?
答案 0 :(得分: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。