代码之家  ›  专栏  ›  技术社区  ›  Layke

使用左连接的MySQL更新查询

  •  24
  • Layke  · 技术社区  · 14 年前

    表名: file_manager_folder

    id parentId , name

    如果没有具有相同parentId和名称的文件夹,我希望我的更新仅“移动”文件夹。在任何正常文件系统下都会出现这种行为。

    例如:

    UPDATE file_manager_folder set parentId = 54 where id IN( '1','2',3') 
    

    将是一个不检查任何关于parentId和name的查询。。。但我怎样才能让左联开始工作。

    我试过一个。。这完全行不通。

    SELECT * FROM 
        file_manager_folders as a
    LEFT JOIN file_manager_folders as b on a.id = b.id 
    WHERE b.id IS NOT NULL and a.id IN("1","2","3") and a.parentId = 54
    

    UPDATE table1 LEFT JOIN table2 SET t1.x = t2.y ON condition WHERE conditions

    4 回复  |  直到 9 年前
        1
  •  59
  •   Bill Karwin    14 年前

    因此,仅当目标父文件夹下具有相同名称的文件夹移动时,才需要移动文件夹 存在:

    UPDATE file_manager_folder f1
    LEFT OUTER JOIN file_manager_folder f2 
        ON f1.name = f2.name AND f2.parentId = 54
    SET f1.parentId = 54 
    WHERE f2.name IS NULL AND f1.id IN (1,2,3);
    

        2
  •  2
  •   OMG Ponies    14 年前

    我认为应该用一个 unique constraint/index parentid name 柱。否则,任何对表具有INSERT/UPDATE访问权限的人都可以绕过您的业务规则。

    CREATE UNIQUE INDEX blah_uk ON FILE_MANAGER_FOLDER(parentId, name) USING BTREE
    
        3
  •  2
  •   Savas Vedova    9 年前

    有点天真,但这个怎么样?

    UPDATE file_manager_folder SET parentId = 54 
    WHERE id IN( '1','2','3') 
    AND parentId != 54 
    AND name NOT IN (SELECT name FROM file_manager_folder WHERE id IN ('1', '2', '3'))
    
        4
  •  0
  •   Rahul Sharma Rashid Kurbanov    7 年前

    如果你使用 NOT IN 而不是 LEFT join 那会降低你的表现。

    在查询之前运行Explain,问题很明显。