2012-11-11 29 views
5

私は従来のデータベースに行き、列自体を参照するいくつかの外部キーを発見しました。参照先の列は主キー列です。自己参照外部キーの意味は何ですか?

ALTER TABLE [SchemaName].[TableName] WITH CHECK ADD 
CONSTRAINT [FK_TableName_TableName] FOREIGN KEY([Id]) 
REFERENCES [SchemaName].[TableName] ([Id]) 

どのような意味ですか?

答えて

14
ALTER TABLE [SchemaName].[TableName] WITH CHECK ADD 
CONSTRAINT [FK_TableName_TableName] FOREIGN KEY([Id]) 
REFERENCES [SchemaName].[TableName] ([Id]) 

この外部キーは完全に冗長で無意味です。削除するだけです。制約が検証された行と一致するため、決して違反することはありません。

関係はあなたが右の「キー」をクリックした場合、それはビジュアルデザイナを使用して、非常に可能性が作成されている可能性が理由のためのように、2つの異なる列(例えば IdParentId

の間になり、階層テーブルで

オブジェクトエクスプローラで「新規外部キー」を選択し、作成した外部キ​​ーを削除せずにダイアログボックスを閉じ、開いているテーブルデザイナで他の変更を加え、この種類の冗長な制約を作成します。

+1

そう思った。私はそれが可能であることにも驚いています。 – HuBeZa

-7

これは、モデルの冗長性を減らすための推奨方法です。自己参照外部キーを使用する場合(例のように)、表の行間に階層関係が作成されます。表から行を削除するときに何が起こるかに注意してください。削除時にカスケードすると、依然として必要な行が削除される可能性があります。 これらのキーを使用すると、プログラム/プログラマの責任とするのではなく、データ検証の一部がDBモデルに移動します。いくつかの衣装は、このようなやり方を好みます。私は、プログラムやプログラマが責任を負うことを望みます。データモデルは、実稼働環境ではリファクタリングやアップグレードが難しい場合があります。

+7

参照は同じ列の間です。それは階層的な関係としてはほとんど機能しません。 –

関連する問題