php - 从许多表中删除数据的正确方法是什么?

标签 php mysql sql database

当您要删除类别时 - 它会首先删除所有具有相关组和属性的相关产品。一个产品有很多关系。

删除类别时是这样处理的:

if (isset($_POST['catid']) && $_POST['catid'] > 0) {

    $category_id = mysql_real_escape_string($_POST['catid']);

    $SQL = "SELECT * FROM products WHERE category_id = '$category_id'";
    $q_item = mysql_query($SQL);

    while ($dItem = mysql_fetch_assoc($q_item)) {
        $itemid = $dItem['id'];

        $SQL = "SELECT * FROM option_groups WHERE item_id = " . $itemid;
        $q = mysql_query($SQL);

        while ($option_group = mysql_fetch_assoc($q)) {
            $optionGroup = $option_group['id'];

            $SQL = "SELECT * FROM options WHERE option_group_id = " . $optionGroup;
            $q = mysql_query($SQL);
            while ($row = mysql_fetch_assoc($q)) {
                $option = $row['id'];
                mysql_query("DELETE FROM options WHERE id = " . $option);
                mysql_query("DELETE FROM e_groups_options WHERE option_id = " . $option);
            }

            mysql_query("DELETE FROM option_groups WHERE item_id = " . $itemid);
            mysql_query("DELETE FROM products WHERE id = " . $itemid);
        }
    }

    $SQL = "DELETE FROM categories WHERE id = '$category_id'";
    mysql_query($SQL);

}

你可以看到,我使用了很多delete查询,代码看起来有点乱,有没有更安全的替代方法?

存储引擎是 MyISAM,表中有超过 100,000 行数据(字段已编入索引)。

最佳答案

如果这些表与 foreign key 相关,您可以在外键中指定 ON DELETE CASCADE 并只删除类别。您必须切换到 InnoDB 才能应用它。引用 documentation在外键上:

For storage engines other than InnoDB, MySQL Server parses the FOREIGN KEY syntax in CREATE TABLE statements, but does not use or store it

请注意级联操作不会触发触发器。

您可以使用 ALTER TABLE table_name ENGINE = InnoDB 将表切换到 InnoDB。 您可以使用 ALTER TABLE 语句添加外键,例如:

ALTER TABLE products
ADD FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE CASCADE;

有了这个外键,每当您在 categories 上发出 DELETE 语句时,RDBMS 也会删除引用该类别的 products

关于php - 从许多表中删除数据的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7901165/

相关文章:

php - Magento 继承链。好的还是坏的做法?

php - Symfony3,设置用户上次登录日期

mysql - 使用 WKT 绘制多边形 - 使用 OpenLayers 的 XML 文件

sql - 有没有办法根据其中一列值添加表约束?

mysql - SQL索引中<id下划线数字>是什么意思

PHP 5.2.x,监控文件的变化,原生 FAM?

php - 用PHP同时连接和查询两个Mysql数据库

php - Sql - 仅在列的第一个空单元格中插入值

java - Symfony(doctrine)数据库与 Java/C/C++ 服务器交互

java - ORACLE SQL 两个日期之间的差异 hibernate