2013-10-30 40 views
2

我有兩個表產品購買。 在product.purchase_id欄中設置了on delete restrict FK欄,purchase.purchase_id欄。然後,如果我嘗試與FK刪除PRODUCT.PRODUCT_ID,它顯示的錯誤就像我該如何檢查使用PHP刪除限制的外鍵約束

 
A Database Error Occurred 

Error Number: 1451 

Cannot delete or update a parent row: a foreign key constraint fails (`another_bata`.`product_purchase_item`, CONSTRAINT `FK_product_purchase_item_1` FOREIGN KEY (`product_id`) REFERENCES `product` (`product_id`) ON UPDATE CASCADE) 

delete from product where product_id='158' 

Filename: C:\xampp\htdocs\rima_shoe\system\database\DB_driver.php 

Line Number: 330 

但我需要一個用戶友好的錯誤假設你不能刪除這個產品 名單,Beause您已經庫存這個產品

所以我需要在php中檢查這個FK,我該怎麼做?

我的第二個問題..是否有可能刪除已存在的'product.product_id'on delete restrict FK在某些特殊情況下?假設

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

使用異常:

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

您也可以使自己的例外speciallize爲FK錯誤:

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

當FK錯誤occures,你做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; 
+0

好吧,我會試試。但如何解決我的第二個問題 – Imran

2

至於你的第二個問題,我想你可以檢查與PHP的狀態,如果是真的運行此查詢:

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

但外鍵是有原因的,隨意玩他們可能會保留你遲早的驚喜

+0

我可以知道嗎?爲什麼你使用'TRANSANCTION'臨時禁用FK,這可能是什麼將其他FK在這個時候..猜猜有20 + FK當我運行此查詢.......... – Imran

+2

它只是一種方式確保所有步驟都成功,如果一個失敗將不會發生。 – Mihai