与MySQL玩耍 - 如何使用IN编写删除语句
与MySQL玩耍 - 如何使用IN编写删除语句
当我尝试执行以下代码时:
DELETE FROM `TreePaths` WHERE `descendant` IN (SELECT `descendant` FROM `TreePaths` WHERE `ancestor`= 0x04);
我得到了以下错误信息:
#1093 - 无法在FROM子句中指定目标表'TreePaths'进行更新
我该如何使删除操作生效?
更新:
表结构:
CREATE TABLE TreePaths ( ancestor VARBINARY(16) NOT NULL, descendant VARBINARY(16) NOT NULL, PRIMARY KEY (`ancestor`, `descendant`), FOREIGN KEY (`ancestor`) REFERENCES Library(iD), FOREIGN KEY (`descendant`) REFERENCES Library(iD) );
表数据:
ancestor descendant 01 01 02 02 02 03 03 03 02 04 04 04 02 05 04 05 05 05 02 06 04 06 06 06 07 07 08 08 09 09 10 10
在使用MySQL编写删除语句时,可能会遇到使用IN子句的问题。下面是一个解决这个问题的方法:
首先,可以创建一个临时表来存储后代的信息:
CREATE TEMPORARY TABLE tmpTable (descendants VARBINARY(16) NOT NULL); INSERT INTO tmpTable(descendants) (SELECT descendant FROM TreePaths WHERE ancestor = 0x04);
然后,使用DELETE语句和IN子句来删除主表中的数据:
DELETE FROM TreePaths WHERE descendant IN (SELECT descendant from tmpTable);
最后,可以选择性地使用DROP TABLE语句来删除临时表,以释放内存:
DROP TABLE tmpTable;
这样,在会话结束时,临时表会自动被删除。
以上就是使用MySQL编写带有IN子句的删除语句的方法。通过创建临时表来存储需要删除的数据,并使用IN子句来删除主表中的数据,可以有效地解决这个问题。
MySQL提供了一种更简单的方法来执行多表删除操作。这种方法可以通过使用JOIN子句来连接要删除的表,并通过WHERE子句来指定删除的条件。下面是一个示例代码:
DELETE paths_to_subtree FROM `TreePaths` AS paths_to_subtree JOIN `TreePaths` AS subtree USING (`descendant`) WHERE subtree.`ancestor`= 0x04;
这段代码的作用是删除`TreePaths`表中满足条件`subtree.ancestor = 0x04`的记录。
然而,有些开发者可能认为MySQL的写法相对复杂,不够直观。因此,他们可能会觉得MySQL使事情变得比实际需要的要困难一些。
为了帮助开发者更好地理解和处理MySQL中的层次数据,有人分享了一份幻灯片,链接为:[slideshare.net/billkarwin/models-for-hierarchical-data](http://www.slideshare.net/billkarwin/models-for-hierarchical-data)。
在这份幻灯片中,可能包含了更多有关处理层次数据的方法和技巧,开发者可以参考这些内容来更好地处理MySQL中的层次数据。