与MySQL玩耍 - 如何使用IN编写删除语句

15 浏览
0 Comments

与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

0
0 Comments

在使用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子句来删除主表中的数据,可以有效地解决这个问题。

0
0 Comments

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中的层次数据。

0