2016-03-26 3 views
1

CASCADEオプションを指定して「外部キー制約」が削除されたときにどうなるかは不明です。例えば外部キーのドロップでのCASCADEの動作

、オプションのCASCADEが、この場合に行うことになっている何

ALTER TABLE table1 DROP CONSTRAINT foreignKeyToTable2 CASCADE. 

このコマンドを検討?私がそれを省略するとどうなりますか?そしてCASCADEの代わりにRESTRICTを書いたら?

注:このクエリの例は、「Ramez Elmasri、Shamkant B. Navathe - データベースシステムの基礎、第5章の終わり」から抜粋したものです。

+0

私は外来キーの仕組みが広すぎることを説明すると思います。データベースのドキュメントは、これをかなりうまくカバーしています。アイデアはデータベース全体でほぼ同じです。以下は、MySQLのドキュメントです:https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html。 –

+0

どのDBMSを使用していますか? –

+0

@ GordonLinoff私は外部キーがどのように動作するかを研究しましたが、キーワードCASCADEを削除する必要があるかどうかはわかりません。つまり、table2を参照してtable1から外部キーを作成し、CASCADEキーワードを使用してtable2を削除すると、外部キーが削除されます。私はDBMSの場合、私はコマンドの実行後に何も削除しませんALTER TABLE table1 DROP CONSTRAINT foreignKeyToTable2 CASCADE。 – Nisba

答えて

3

プライマリキーをドロップするときのみ、制約を削除するオプションが必要です。外部キーを削除するときには使用しないでください。

Postgresの中で、この例を考えてみましょう:

create table t1 (id integer, constraint pk_one primary key (id)); 
create table t2 (id integer primary key, id1 integer references t1); 

あなたが実行しようとすると:

alter table t1 drop constraint pk_one; 

あなたが得る:

ERROR: cannot drop constraint pk_one on table t1 because other objects depend on it 
    Detail: constraint t2_id1_fkey on table t2 depends on index pk_one 
    Hint: Use DROP ... CASCADE to drop the dependent objects too. 

あなたが実行している場合:

alter table t1 drop constraint pk_one cascade; 

あなたが得る:

NOTICE: drop cascades to constraint t2_id1_fkey on table t2 

は、主キーを必要とする外部キーも同様にドロップされたことを知らせます。


すべてのDBMSがカスケードドロップをサポートするわけではないことに注意してください。 PostgresとOracleはそうしています。
MySQL、SQL Server、またはFirebirdはサポートしていません。それらのDBMSに手動で外部キーをドロップする必要があります。

+0

ありがとうございました!したがって、本の例は間違っていました! @ルーママコノコート。 – Nisba

+0

。この構文は、PostgresとOracleにとって正しいものです。外部キーを削除するときには必要ありません。 –

+0

"ドロップカスケードから制約へ"のお知らせ – tuxayo

関連する問題