在PHP上执行mysql级联删除

时间:2012-03-05 16:20:02

标签: php mysql

我正在帮我的朋友做一些数据库管理工作。基本上他有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连接到数据库方面有什么错误吗?

5 个答案:

答案 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_loccity_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帖子,该帖子将回答您的问题。