ホームページ > データベース > mysql チュートリアル > 外部キー制約違反により親行を削除できないのはなぜですか?

外部キー制約違反により親行を削除できないのはなぜですか?

Susan Sarandon
リリース: 2025-01-14 16:21:44
オリジナル
232 人が閲覧しました

Why Can't I Delete a Parent Row Due to a Foreign Key Constraint Violation?

外部キー制約違反: 親行の削除または更新

jobs テーブル (親テーブル) からレコードを削除しようとすると、外部キー制約違反エラーが発生します。 エラー メッセージは、advertisers テーブル、具体的には advertisers_ibfk_1advertisers.advertiser_id にリンクする jobs.advertiser_id 制約を参照しています。この依存関係により、親行の削除または変更が防止されます。

根本的な原因はデータベース スキーマにあります:

<code class="language-sql">CREATE TABLE `advertisers` (
  `advertiser_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  ...
  PRIMARY KEY (`advertiser_id`),
  FOREIGN KEY (`advertiser_id`) REFERENCES `jobs` (`advertiser_id`)
);

CREATE TABLE `jobs` (
  `job_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `advertiser_id` int(11) unsigned NOT NULL,
  ...
  PRIMARY KEY (`job_id`)
);</code>
ログイン後にコピー

advertisers テーブルの外部キー制約により、すべての advertiser_idjobs テーブルに対応するエントリを持つ必要があります。 ジョブ (例: job_id = 1) が広告主 (advertiser_id = 1) に関連付けられている場合、ジョブを削除すると advertiser_id テーブル内の advertisers が孤立したままになり、制約に違反します。データベースは、データの整合性を維持するためにこのアクションをブロックします。

制約違反の解決

回避策には、外部キーのチェックを一時的に無効にすることが含まれます。

<code class="language-sql">SET FOREIGN_KEY_CHECKS = 0; -- Disable foreign key checks
DELETE FROM `jobs` WHERE `job_id` = 1 LIMIT 1;
SET FOREIGN_KEY_CHECKS = 1; -- Re-enable foreign key checks</code>
ログイン後にコピー

これにより、制約の適用がバイパスされ、削除が許可されます。 重要なのは、データベースの整合性を復元するには、後でチェックを再度有効にすることが重要です。 ただし、これは一時的な解決策です。 より堅牢なアプローチには、カスケード削除 (ON DELETE CASCADE) または advertisers.jobs から削除する前に

テーブル内の関連データを適切に管理することが含まれます。

以上が外部キー制約違反により親行を削除できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート