Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从多个表中删除数据的正确方法是什么?_Php_Mysql_Sql_Database - Fatal编程技术网

Php 从多个表中删除数据的正确方法是什么?

Php 从多个表中删除数据的正确方法是什么?,php,mysql,sql,database,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 = '$categor

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

这是删除类别时的处理方式:

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

}
你可以看到,我使用了很多删除查询,代码看起来有点凌乱,有没有其他更安全的方法


存储引擎是MyISAM,我在表字段中有超过100000行的数据被索引。

如果这些表与关联,您可以在外键中指定ON DELETE CASCADE,然后只删除类别。您必须切换到InnoDB才能应用此功能。引用外键上的

对于InnoDB以外的存储引擎,MySQL服务器解析CREATE TABLE语句中的外键语法,但不使用或存储它

考虑到级联操作不会触发触发器

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

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

使用此外键,每当您发出关于类别的DELETE语句时,RDBMS也将删除引用此类别的产品

如果这些表与关联,您可以在外键中指定ON DELETE CASCADE,只删除类别。您必须切换到InnoDB才能应用此功能。引用外键上的

对于InnoDB以外的存储引擎,MySQL服务器解析CREATE TABLE语句中的外键语法,但不使用或存储它

考虑到级联操作不会触发触发器

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

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

使用此外键,每当您发出关于类别的DELETE语句时,RDBMS也将删除引用此类别的产品

我认为最好的方法是使用一个支持外键约束的存储引擎,比如InnoDB,让它通过ON DELETE CASCADE处理这个问题,这样DBMS就可以为您完成这项工作


到目前为止,MyISAM是这样做的。

我认为最好的方法是使用一个支持外键约束的存储引擎,比如InnoDB,让它通过删除级联来处理这个问题,这样DBMS就可以为您完成这项工作


到目前为止,MyISAM仍在运行。

如果您不想或无法将数据库引擎更改为innodb,可以使用join对多个表执行删除操作:

DELETE t1, t2, t3
FROM tabel1 AS t1
LEFT JOIN table2 AS t2 ON t1.id = t2.pid
LEFT JOIN table3 AS t3 ON t2.id = t3.pid
WHERE t1.id = $id

如果有一种方法可以联接所有要从中删除行的表,则可以调整代码以执行如下单个查询。

如果不想或无法将数据库引擎更改为innodb,则可以使用join对多个表执行删除:

DELETE t1, t2, t3
FROM tabel1 AS t1
LEFT JOIN table2 AS t2 ON t1.id = t2.pid
LEFT JOIN table3 AS t3 ON t2.id = t3.pid
WHERE t1.id = $id

如果有一种方法可以连接所有要从中删除行的表,则可以调整代码以执行类似这样的单个查询。

因为您使用的是MyISAM,无法执行级联删除,所以只需执行一个联接删除即可

DELETE table1, table2 FROM table1 LEFT JOIN table2 ON table1.id = table2.t1_id WHERE table1.id = $id

由于您使用的是MyISAM,无法执行级联删除,因此可以简单地执行联合删除

DELETE table1, table2 FROM table1 LEFT JOIN table2 ON table1.id = table2.t1_id WHERE table1.id = $id

答案已经被接受了,但出于兴趣:如果你被困在一个不进行级联删除的数据库上,你可以使用一个ORM,比如Prope。我认为可以将其配置为在db本机不支持的情况下手动执行级联删除。

答案已经被接受,但出于兴趣:如果您被困在一个不执行级联删除的数据库上,您可以使用诸如Prope之类的ORM。我相信可以将其配置为在db本机不支持的情况下手动执行级联删除。

我没有在mysql中声明外键。@user791022-好的,您可以吗?:第一个问题是,您使用MyISAM是一种选择,还是仅仅因为它是默认值?如果愿意,可以使用ALTER TABLE_name ENGINE=InnoDB;将表切换到InnoDB;。之后,您可以使用级联创建外键。我没有在mysql中声明外键。@user791022-好的,您可以吗?:第一个问题是,您使用MyISAM是一种选择,还是仅仅因为它是默认值?如果愿意,可以使用ALTER TABLE_name ENGINE=InnoDB;将表切换到InnoDB;。之后,可以使用级联创建外键。