部署名への外部キーに影響を与えずに、学校のテーブルからレコードを削除したいと考えています。試してみましたが、次のメッセージが表示されました。
「親行を削除または更新できません: 外部キー制約が失敗しました (
arusms
.department
, CONSTRAINTdepartment_ibfk_1
FOREIGN KEY (school_name
) REFERENCESschool
(school_name
) ON UPDATE CASCADE)」
部署名への外部キーに影響を与えずに、学校のテーブルからレコードを削除したいと考えています。試してみましたが、次のメッセージが表示されました。
「親行を削除または更新できません: 外部キー制約が失敗しました (
arusms
.department
, CONSTRAINTdepartment_ibfk_1
FOREIGN KEY (school_name
) REFERENCESschool
(school_name
) ON UPDATE CASCADE)」
なぜそんなことをしたいのかわかりません。学校を削除すると、学部は孤立します。これが、参照整合性を強化するために、そもそも外部キーを持つことのポイントです。部門を残してこれを実行できるようにする場合は、外部キーを変更してON DELETESETNULLを含める必要があります。それ以外の場合は、制約を削除し、削除を実行して、制約を再作成する必要があります。
あなたのエラーメッセージは本当の原因を隠しています.
(
arusms.department,
CONSTRAINT department_ibfk_1
FOREIGN KEY (school_name)
REFERENCES school (school_name)
ON UPDATE CASCADE
)
外部キー制約を作成したときに、そのON DELETE
部分を省略しました。MySQL はこれにデフォルトのアクションを使用しましたON DELETE RESTRICT
。MySQL のドキュメントを参照してください:FOREIGN KEY
制約
関連する部門に影響を波及させずに学校を削除できるようにしたい場合は、次のいずれかを実行できます。
FK 制約を削除するか、
列 ( department.school_name
) をヌル可能にし、制約を変更してON DELETE SET NULL
アクションを実行します。
学校を削除し、関連する部門をカスケード削除できるようにしたい場合は、次のことができます。
ON DELETE CASCADE
。 外部キーを持つことの全体的な目的は、データの一貫性を保つことです。あなたの場合、それぞれに対応するレコードdepartment
が存在する必要があることを意味します。school
また、学校の場合はDELETE
、対応するすべての学部も削除するか、少なくともそれらのschool
参照をNULL
編集する必要があります。
この種の強制が必要ない場合はDROP
、外部キー。
または、学部を別の学校に再割り当てしたい場合は、最初にそれを行い、その後DELETE
で元の学校に移動します。