Imr*_*ran 2 php mysql sql database
我有两张表Product和buy。我on delete restrict在product.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)
使用异常:
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)