web-dev-qa-db-ja.com

主キーと外部キーを同時に

SQL Server 2008では、同時にプライマリキーと外部キーである2つの列を使用してテーブルを作成できますか?はいの場合、そのようなコードはどのように見えますか?私は検索しましたが、何も思いつきませんでした。

38
Eduard Luca

もちろん問題ありません:

CREATE TABLE dbo.[User]
(
  Id int NOT NULL IDENTITY PRIMARY KEY,
  Name nvarchar(1024) NOT NULL
);

CREATE TABLE [Group] 
(
  Id int NOT NULL IDENTITY PRIMARY KEY,
  Name nvarchar(1024) NOT NULL
);

CREATE TABLE [UserToGroup]
(
  UserId int NOT NULL,
  GroupId int NOT NULL,
  PRIMARY KEY CLUSTERED ( UserId, GroupId ),
  FOREIGN KEY ( UserId ) REFERENCES [User] ( Id ) ON UPDATE  NO ACTION  ON DELETE  CASCADE,
  FOREIGN KEY ( GroupId ) REFERENCES [Group] ( Id ) ON UPDATE  NO ACTION  ON DELETE  CASCADE
);

これは多対多の関係をモデル化するために非常に一般的に使用されます。

54

これらはまったく異なる構造です。

プライマリキーは、テーブル内の一意性を強制し、特定のレコードの一意の識別子にするために使用されます。

外部キーは、参照整合性のために使用され、値が別のテーブルに存在することを確認します。

外部キーは、別のテーブルの主キーを参照する必要があります。

一意の外部キーが必要な場合は、FK制約を作成し、その同じフィールドに一意のインデックス/制約を追加できます。

参照のために、SQL ServerではFKがUNIQUE CONSTRAINTおよびPRIMARY KEYフィールド。

8
JNK

テーブル内で重複する外部キーを許可したいことが多いため、これはおそらく良い考えではありません。あなたが今、そうしなくても、将来、あなたはそうするかもしれないので、これをしないのが最善です。 外部キーを主キーとして使用しても問題ありませんか?

3

簡単なメモ-Microsoftページから( http://msdn.Microsoft.com/en-us/library/ms189049.aspx )...

「外部キー制約は、別のテーブルの主キー制約にのみリンクする必要はありません。別のテーブルのUNIQUE制約の列を参照するように定義することもできます。」

頻繁には使用されませんが、状況によっては便利です。

1
KeithFearnley