当您要删除类别时 - 它会首先删除所有具有相关组和属性的相关产品。一个产品有很多关系。
删除类别时是这样处理的:
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/