gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:44:43 26 4
gpt4 key购买 nike

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

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com