如何使用 PHP 检查删除限制的外键约束

Imr*_*ran 2 php mysql sql database

我有两张表Productbuy。我on delete restrictproduct.purchase_id列与purchase.purchase_id列中设置了 FK。然后,如果我尝试使用 FK 删除product.product_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
Run Code Online (Sandbox Code Playgroud)

Dan*_* W. 5

使用异常:

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

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

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

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

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

更新:

mysqli 已经有例外:

} catch (mysqli_sql_exception $e) {
    if ($e->getCode() == 'CODE FOR FK') {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

另一个有用的问题:HandlingforeignkeyExceptionsinPHP

第二个问题更新:

禁用外键

SET foreign_key_checks = 0;
<your delete query here>
SET foreign_key_checks = 1;
Run Code Online (Sandbox Code Playgroud)