2

我有两张表Productpurchase。我在列中设置了一个on delete restrictFK 。然后,如果我尝试使用 FK 删除 product.product_id,它会显示错误,就像product.purchase_idpurchase.purchase_id

发生数据库错误

错误号:1451

无法删除或更新父行:外键约束失败(`another_bata`.`product_purchase_item`, CONSTRAINT `FK_product_purchase_item_1` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`) ON UPDATE CASCADE)

从 product_id='158' 的产品中删除

文件名:C:\xampp\htdocs\rima_shoe\system\database\DB_driver.php

行号:330

但是我需要一个用户友好的错误假设你不能删除这个产品列表,因为你已经有这个产品了

所以我需要在 php 中检查这个 FK,我该怎么做?

on delete restrict我的第二个问题.. 是否可以删除在某些特殊情况下已经存在 FK 的“product.product_id” ?认为

DELETE p,q FROM product AS p INNER JOIN purchase AS q
WHERE p.purchase_id=q.purchase_id AND q.purchase_quan=0
4

2 回答 2

4

使用例外:

try {
    $db->query(...);
} catch (Exception $e) {
    echo "an error occured during query";
}

您还可以创建自己的异常来专门针对 FK 错误:

class ForeignKeyException extends Exception {
    public function __construct($msg = 0, $code = 0) {
        parent::__construct($msg, $code);
    }
}

当 FK 错误发生时,你做throw new ForeignKeyException('FK failed');

try {
    $db->query(...);
} catch (ForeignKeyException $e) {
    echo "FK error";
} catch (Exception $e) {
    echo "general error";
}

更新:

mysqli 已经有例外:

} catch (mysqli_sql_exception $e) {
    if ($e->getCode() == 'CODE FOR FK') {
        //...
    }
}

PHP mysqli 异常: http: //php.net/manual/en/class.mysqli-sql-exception.php

查看 MYSQLI 错误代码:http ://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html

另一个有用的问题:Handling foreign key exceptions in PHP

更新第二个问题:

禁用外键

SET foreign_key_checks = 0;
<your delete query here>
SET foreign_key_checks = 1;
于 2013-10-30T15:21:18.363 回答
2

至于您的第二个问题,我想您可以使用 php 检查条件,如果为真,请运行此查询:

START TRANSACTION
SET FOREIGN_KEY_CHECKS=0;
DELETE WHAT YOU WANT;
SET FOREIGN_KEY_CHECKS=1;
COMMIT

但是外键的存在是有原因的,随意玩弄它们迟早会给你带来惊喜

于 2013-10-30T15:33:24.800 回答