使用左连接的MySQL更新查询

使用左连接的MySQL更新查询,mysql,left-join,Mysql,Left Join,表架构 表名:file\u manager\u文件夹 行:id,parentId,name 我的查询模拟将文件夹移动到另一个文件夹中,并使用(?)接受数组 如果还没有具有相同父ID和名称的文件夹,我希望我的更新仅“移动”文件夹。在任何正常文件系统下都会出现这种行为 例如: UPDATE file_manager_folder set parentId = 54 where id IN( '1','2',3') 将是一个不检查任何有关parentId和名称的查询。。。但我怎样才能让左撇子加入工

表架构

表名:
file\u manager\u文件夹

行:
id
parentId
name

我的查询模拟将文件夹移动到另一个文件夹中,并使用(?)接受数组

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

例如:

UPDATE file_manager_folder set parentId = 54 where id IN( '1','2',3') 
将是一个不检查任何有关parentId和名称的查询。。。但我怎样才能让左撇子加入工作

这是我试过的一个。。这完全不起作用

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 table 1 LEFT JOIN table 2在条件下设置t1.x=t2.y,其中条件为

,因此仅当目标父文件夹下不存在同名文件夹时才移动文件夹:


联接条件在目标父项下搜索具有相同名称的文件夹。WHERE子句测试不存在这样的文件夹(仅当外部联接未找到匹配项时,f2.name才为null)。

有点幼稚,但这又如何

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'))

我认为这应该通过在
parentid
name
列上使用a来解决。否则,任何对表具有INSERT/UPDATE访问权限的人都可以绕过您的业务规则

CREATE UNIQUE INDEX blah_uk ON FILE_MANAGER_FOLDER(parentId, name) USING BTREE

如果使用不在中的
而不是
左键,则会降低性能


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

这是完美的账单。我可以看出我已经准备好了基本的东西。。太离谱了!我不知道你怎么这么快就搞定了。我想不出我想参加什么。
CREATE UNIQUE INDEX blah_uk ON FILE_MANAGER_FOLDER(parentId, name) USING BTREE