テーブルが主キーをそれ自体の外部キーとして使用する理由


21

データベースを調べてみると、主キーをそれ自体の外部キーとして使用するテーブルに出会いました。

テーブルは、階層構造を構築するためにそれ自体への外部キーを持つことができますが、主キーを参照するために別の列を使用します。

主キーは一意であるため、この状況では行は自分自身を指すことしかできませんか?これはトートロジーのリンクのようです。なぜなら、もし私が列をすでに持っているなら、列をすでに持っているからです。

これが行われる理由はありますか?

テーブルがそれ自体に結合しました

定義の両方の半分に同じテーブルと列が使用されているため、制約はそのように書かれています(ダイアグラムを見るだけではありません)。


6
おそらくデザイナーのCACK利き使用して、私の理論がある
マーティン・スミス

回答:


28

あなたが言ったように。FOREIGN KEY通常、同じテーブルを参照する制約は階層構造用であり、主キーを参照するために別の列を使用します。良い例は従業員のテーブルです:

EmployeeId    Int     Primary Key
EmployeeName  String
ManagerId     Int     Foreign key going back to the EmployeeId

したがって、この場合、テーブルからそれ自体に戻る外部キーがあります。すべてのマネージャーは従業員でもあるため、ManagerId実際EmployeeIdにはマネージャーのものです。

一方、誰かEmployeeIdがEmployeeテーブルへの外部キーとして使用することを意味する場合、それはおそらく間違いでした。私はテストを実行しましたが、それは可能ですが、実際には使用できません。

CREATE TABLE Employee (EmployeeId Int PRIMARY KEY,
                        EmployeeName varchar(50),
                        ManagerId Int);


ALTER TABLE Employee ADD CONSTRAINT fk_employee 
    FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId);

1
この場合、マネージャーを「分離」する場合は、EmployeeIdに関連するManagerIdに制約を設定すると便利です。そのように設定すると、行の削除は許可されません。私はそのようにするつもりはありませんが、あなたのアプリケーションがマネージャーを持つ従業員に依存していれば、いくらかの利益があります。
zgr024 14年

6

私は自分のデータベースでこのような外部キーを見つけましたが、自分で作成したはずです。これは偶然に起こったと思う。(Management Studio、SQL 2014 Express内で)プライマリキーを持つテーブルのコンテキストメニューで[新しい外部キー]をクリックすると、それ自体を参照する外部キーが既に自動的に作成されます。下記参照:

ここに画像の説明を入力してください

その後、新しいものを追加するのではなく、その1つを変更する必要があることに気付いていない場合は、そこにとどまります。または、[閉じる]ボタンをクリックして[キャンセル]のようにすると、テーブル定義を保存した後も外部キーが作成されます。

したがって、このような外部キーは意味をなさないため、削除できます。


FKを作成し、そのプロセスで他のテーブルがまだPKを設定していないことに気付いたため、キャンセルして他のテーブルに移動し、何らかの理由でFKプロセスを続行することを忘れた可能性があります。再帰FKがあります。
アンドリュー

4

おそらく、デザイナーはTRUNCATE TABLE

TRUNCATE TABLE 外部キー制約があるテーブルでは使用できません 別のテーブルにそれはかかわらすることができますがある場合に使用される自己参照外部キー。TRUNCATE TABLE(Transact-SQL)のドキュメントから:

BOLエキス

DELETEなしの文WHERE句は、同様の効果がありますTRUNCATE TABLE(表内のすべての行を削除する)が、DELETEステートメントができるようにする理由かもしれません削除トリガー、発射DELETEではなくをTRUNCATE TABLE

私は権限を使用してこれを行います(DELETE削除権限がTRUNCATE TABLE必要、テーブル変更権限が必要です)が、おそらくデザイナーがこれを行えなかった何らかの理由がありますか?

注:デザイナーが行ったことはの使用を実際に無効にするものではありませんがTRUNCATE TABLE、私はまだこれが彼らの意図であると推測しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.