我正在帮我的朋友做一些数据库管理工作。基本上他有2个数据库,一个叫做城市,一个叫做运费。每个表都显示在一个网页中,每个记录旁边都有编辑和删除按钮。所以他可以通过网络删除数据库中的数据。
这笔交易是,我想在这个mysql数据库上进行级联删除,这样每次我删除city数据库中的一行时,同时删除运费率数据库中具有相同city_ID的相应行。我试着做一些mysql查询组合,但它没有用。这就是我所拥有的
require_once('../../model/city.php');
if(isset($_POST['id'])){
//edit or remove
$id = $_POST['id'];
$dbo = City::get_by_id($id);
if($_POST['action'] == 'remove'){
//remove
//$dbo->delete();
mysql_query("DELETE city.*, shipping_rate_loc.* FROM city c, shipping_rate_loc s WHERE c.ID_city = s.ID_city");
echo "Data is removed.";
}
正如您所看到的,我只是将mysql_query放在他之前的
上$dbo->delete();
设法删除城市的代码,但不是相关的运费。
我在PHP中使用mysql相当新手,所以有人可以帮我指出我的错误在哪里吗?非常感谢你:))
更新: 我从答案中尝试了一些解决方案。他们都没有工作。即使我简化了事情。这让我想知道,在将php连接到数据库方面有什么错误吗?
答案 0 :(得分:2)
最好的方法是修改数据库设置,将on delete cascade
包含在shipping_rate_loc
表的外键中,例如
create table city
(
id integer,
name varchar,
...
primary key (id)
);
create table shipping_rate_loc
(
id integer,
city_from integer,
city_to integer,
...
foreign key (city_from) references city(id) on delete cascade,
foreign key (city_to) references city(id) on delete cascade
);
这样,当您使用
从city
表中删除记录时
DELETE FROM city WHERE id = myid
数据库会自动删除此城市位于shipping_rate_loc
或city_from
列中的表city_to
中的所有记录,而无需您在PHP中执行任何操作。
答案 1 :(得分:1)
从技术上讲,级联应该在表本身上完成。但是这需要设置外键,这反过来需要InnoDB(你的表可能是也可能不是)。
"DELETE city.*, shipping_rate_loc.* FROM city c, shipping_rate_loc s WHERE c.ID_city = s.ID_city"
这个问题是你实际上没有指定在SQL中删除哪个id。而不是
"WHERE c.ID_city = s.ID_city"
试
"WHERE c.ID_city=:city_id AND s.ID_city=:city_id"
并使用参数绑定将POST id传递给查询。
有关其他详细信息,请参阅http://www.php.net/manual/en/ref.pdo-mysql.php
答案 2 :(得分:1)
您可以使用左连接删除来执行级联删除。
这看起来像是:
$query = "DELETE city, shipping_rate FROM city LEFT JOIN shipping rate ON city.id = shipping_rate.city_id WHERE city.id = $blah";
答案 3 :(得分:1)
您可能希望编写存储过程来执行此操作。
CREATE PROCEDURE DeleteCity(IN CityID INT)
BEGIN
delete from city where ID_city = CityID;
delete from shipping_rate_loc where ID_city = CityID;
END $$
之后,删除城市就像:
call DeleteCity(5);
答案 4 :(得分:0)
创建表格时,您应该设置CASCADE删除/更新。
查看this帖子,该帖子将回答您的问题。