2016-08-10 15 views
0

をドロップすることができない私は2つのテーブルのテーブルカテゴリでON DELETE CASCADEを、レコードが親テーブルの上に削除することができますが、親テーブルが

CREATE TABLE `category` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 
CREATE TABLE `item` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    categoryid` int(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (`id`), KEY `fk_categoryid_item` (`categoryid`), 
    CONSTRAINT `fk_categoryid_item` FOREIGN KEY (`categoryid`) 
    REFERENCES `category` (`id`) ON DELETE CASCADE) 
    ENGINE=InnoDB DEFAULT CHARSET=utf8 

を持っている私は、アイテムのid 2. でレコードを持っています私はid = 1、categoryid = 2、カテゴリーテーブルを参照する外部キーとして2のレコードを持っています。 id 2のカテゴリテーブルの行を削除すると、categoryidが2のアイテムテーブルのレコードも削除されます。これは、削除カスケードのために予想されるとおりです。しかし、テーブルカテゴリを削除しようとすると、エラーコードが表示されます。

1217. Cannot delete or update a parent row: a foreign key constraint fails 

なぜこのようなことが起こりますか?もちろん、テーブルを削除するforeign_key_checks = 0を設定することが可能になります。しかし、なぜ私たちはレコードを削除することができますが、カスケード削除オプションでテーブルを削除することはできませんが起こっているか知りたいです。このオプションは、レコードの削除にのみ適用されますが、テーブルの削除には適用されません。

ドキュメントを確認しましたが、これについて何の説明も見つかりませんでした。

私が紛失している基本的なことがある場合や、関連するドキュメントを参考にしておくと役立ちます。私はMySQL 5.7を使用しています。

ありがとうございます。

+0

[テーブルを削除できません:外部キー制約が失敗します](http://stackoverflow.com/questions/11100911/cant-drop-table-a-foreign-key-constraint-fails) – Rupsingh

+0

親テーブルを削除すると、レコードを挿入または更新するときにFK制約をチェックする必要があるため、子テーブルに行を挿入/更新できなくなるという論理的な説明がある可能性があります。 –

+1

基本的。 MySQLは**リレーショナル**データベースです。外部キーはリレーションを設定するために使用されます。リレーションに依存する部分を削除すると、リレーションが破損し、そのリレーションシップを設定してデータ**の完全性**を保証します。関係するテーブルを削除すると整合性に違反するため、エラーが発生します。それは正常です。レコードを持たないことは、テーブルを持たないことと同じではありません。 – Mjh

答えて

0

テーブルcategoryを削除しても、外部キーを削除/変更しないと、何も指し示されません。内部的にデータベースには、参照制約を強化する管理システムがあり、失われたデータを作成しないようにします。 thisthisthisの質問も参照してください。

これは、それの背後にある数学とも関係があり、という関係代数と呼ばれています。私もそのレベルにはいませんが、関連するテーブルの1つを削除するとFKの定義が破られると思います。

データベースのリレーショナル・モデリングとインプリメンテーションでは、ユニーク・キーはゼロまたは複数の属性のセットで、その値はリレーション内の各タプル(行)に対して一意であることが保証されています。

+0

次に、 'delete delete set null'によって親テーブルが削除されないのはなぜですか?親を指すすべてのレコードをnullにする必要はありませんか?この背後にあるdbmsの設計上の決定はありますか? –

+0

私の理解から、FKは行レベルで実装されていますが、テーブルレベルで制約が作成されます。 –

+0

'on delete set null ' - それでもまだ別のアクションで削除トリガを解決するだけです - エントリ全体を削除するのではなく、従属値にNULLを設定します –

関連する問題