Mysql 将查询合并为一个查询以进行优化

Mysql 将查询合并为一个查询以进行优化,mysql,optimization,Mysql,Optimization,我编写了以下查询,其中更新了两个表,但在三个不同的查询中进行了更新 查询条件如下: 根据“用户id”检查表中的空座位,并更新“用户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', modifi

我编写了以下查询,其中更新了两个表,但在三个不同的查询中进行了更新

查询条件如下:

根据“用户id”检查表中的空座位,并更新“用户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';
再次更新
座位
表格,将
登记的
列更新为1,在
座位
表格中使用相同的
图书id

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

我可以将它们编写为一个优化的查询吗?

您可以联接这些表并在一条语句中执行所有更新,但如果您真的只想更新一行,则不能。如图所示,只有单表语法支持
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;
这可以确保此块中的所有语句都成功或没有成功。如果最后一个失败,前一个将被回滚。他们被视为一个声明,请阅读更多有关这方面的内容。先决条件是,您需要使用能够进行事务处理的存储引擎,如InnoDB。还要确保你使用了合适的工具