【问题标题】:How to use update together with select...for update in mysql如何在 mysql 中使用 update 和 select...for update
【发布时间】:2019-02-19 11:11:22
【问题描述】:

我有两个MySql表tableA和tableB,tableA中的主键“id”用作tableB中的外键“parent_id”。我想使用 select...for update 更新 tableB 中的单行,以便其他用户在事务未结束时无法访问它。我的问题是 - 如何在一个查询中正确更新选定的行?这是我的示例代码:

START TRANSACTION;
SELECT b.reserved, b.owner FROM tableB b, tableA a 
WHERE b.parent_id = a.id AND a.guid ='5344a990-fedf-4deb-a114-0d5d6a3ba180' FOR UPDATE;
UPDATE tableB SET...;
COMMIT;

谢谢!

【问题讨论】:

    标签: mysql select sql-update


    【解决方案1】:

    是的,这是可能的。 请看:

    以下是您的查询的示例:

    START TRANSACTION;
    # Lock table using `FOR UPDATE`
    SELECT 
      b.reserved, 
      b.owner 
    FROM 
      tableB b,
      tableA a 
    WHERE 
      b.parent_id = a.id 
      AND a.guid ='5344a990-fedf-4deb-a114-0d5d6a3ba180' 
    FOR UPDATE;
    
    # Update query
    UPDATE 
      tableA 
    SET 
      tableA.column1=(
        SELECT 
          b.reserved 
        FROM 
          tableB b, 
          LEFT JOIN tableA a ON a.id=b.id 
        WHERE 
          b.parent_id = a.id 
          AND a.guid ='5344a990-fedf-4deb-a114-0d5d6a3ba180'
      ) 
    WHERE ... 
    LIMIT 1;  
    
    COMMIT;
    

    希望对你有帮助,

    【讨论】:

    • 感谢您的回答。我能问一下 select..for 更新部分应该放在哪里吗?我需要确保没有其他人能够写入同一行。
    • 所以基本上这意味着我必须执行两个查询 - 一个选择并锁定该行,第二个再次找到它并进行更新?
    • 是的,afaik。这是你要找的吗?
    • 是的,这就是我要找的!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2011-05-17
    相关资源
    最近更新 更多