2

Productpurchaseの 2 つのテーブルがあります。列のある列に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 をチェックする必要があります。どうすればこれを行うことができますか?

私の 2 番目の質問..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

別の役立つ質問: PHP での外部キー例外の処理

2 番目の質問の更新:

外部キーを無効にする

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

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 に答える