SQL Server 2008で複合主キーを作成する方法


178

SQL Server 2008でテーブルを作成したいのですが、複合主キーを作成する方法がわかりません。どうすればこれを達成できますか?


1
あなたがasp.netを初めて使用するときのアドバイス:複合主キーは、よく考えられていない設計を示す悪いものです
smirkingman

47
@smirkingman非常に重要な問題を解決できます。多くの場合、複合主キーを使用することでほぼ解決できます。たとえば、単一のテーブル/エンティティタイプに行を保存する数百人/数千人のユーザーがいる場合などです。ユーザーIDと2番目の値の順に並べた行が必要です。あなたの価値判断は単に正しくありませんが、そうでない場合は、この機能を間もなく廃止する予定です。
ニコラスピーターセン2012

回答:


243
create table my_table (
     column_a integer not null,
     column_b integer not null,
     column_c varchar(50),
     primary key (column_a, column_b)
);

2
使用の間diference何である主キー制約を @マシュー・アボット社の例のようにしますか?
mateuscb '06 / 10/19

28
名前で削除/更新できる名前付き制約を作成します
longhairedsi

14
まったくそうではありません。どちらも「名前付き制約」を作成します。前者の場合、名前を制御する必要はありません。ただし、作成したら、使用した名前を検索し、名前で削除/更新できます...
Auspex

170
CREATE TABLE UserGroup
(
  [User_Id] INT NOT NULL,
  [Group_Id] INT NOT NULL

  CONSTRAINT PK_UserGroup PRIMARY KEY NONCLUSTERED ([User_Id], [Group_Id])
)

34
+1-はい、制約に名前を付けます。そうでない場合、Sql Serverは、あるリリースのDBではPK_UserGrou_5DEAEAF5、別のリリースではPK_UserGrou_3214EC0777F66C69と名前を付けるなど、厄介なことを行います。最初にdbから名前を取得してから動的SQLを使用する(または最初にコードでコマンドを作成する)必要があるため、PKを更新または削除する必要がある場合、これは面倒です。また、醜いです。
モンティ2015年

2
PKをクラスター化したくない理由はありますか?
4AM

1
@ 4AMこれであなたの質問に答えることができます:リンク
ドンミネーター2017年

52

Enterprise Manager(SSMS)経由...

  • 複合キーを作成するテーブルを右クリックし、[ デザイン]を選択します。
  • 複合キーとして形成する列を強調表示します
  • それらの列を右クリックし、主キー設定します

SQLを確認するには、右をクリックすることができますTable> Script Table As>Create To


2
ありがとうございました。これは、潜在的に私のSQL構文をめちゃくちゃにせずに、最も安全な/最も簡単な方法です
AlbatrossCafe

1
これにより、設計/ GUIDインターフェースを介して迅速な修正が必要なユーザーが簡単になります。助けてくれてありがとう。
Trevor Nestman 2017年

32

私はこのパーティーに遅れていることを知っていますが、既存のテーブルについては、以下を試してください。

ALTER table TABLE_NAME
ADD CONSTRAINT [name of your PK, e.g. PK_TableName] PRIMARY KEY CLUSTERED (column1, column2, etc.)

27

MSSQL Server 2012の場合

CREATE TABLE usrgroup(
  usr_id int FOREIGN KEY REFERENCES users(id),
  grp_id int FOREIGN KEY REFERENCES groups(id),

  PRIMARY KEY (usr_id, grp_id)
)

更新

追加する必要があります!

変更する外部/主キーを追加する場合は、まず制約付きのキーを作成する必要があります。そうしないと変更できません。以下のように:

CREATE TABLE usrgroup(
  usr_id int,
  grp_id int,

  CONSTRAINT FK_usrgroup_usrid FOREIGN KEY (usr_id) REFERENCES users(id),
  CONSTRAINT FK_usrgroup_groupid FOREIGN KEY (grp_id) REFERENCES groups(id),

  CONSTRAINT PK_usrgroup PRIMARY KEY (usr_id,grp_id)
)

実際に最後の方法は、より健康的でシリアルです。FK / PK制約名(dbo.dbname> Keys> ..)を検索できますが、制約を使用しない場合、MSSQLはランダムなFK / PK名を自動作成します。必要なすべての変更(代替テーブル)を確認する必要があります。

自分で基準を設定することをお勧めします。制約は、標準に従って定義する必要があります。あなたは暗記する必要はありませんし、あまりにも長い間考える必要はありません。つまり、作業が速くなります。


これはPKを作成せず、FKのみを作成しますか?
batmaci 2017年

@batmaci; いいえ、それはPKに対するFKグループとダブルFKグループの両方です。その使用はより健康的です。私はそれをお勧めします。PKを作成しない場合も使用できます。
Fatih MertDoğancan2017年

1

最初にデータベースとテーブルを作成し、手動で列を追加します。主キーとなる列。この列を右クリックして主キーを設定し、主キーのシード値を設定する必要があります。



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