SQL Server 2008'de bileşik birincil anahtar nasıl oluşturulur


178

SQL Server 2008'de tablolar oluşturmak istiyorum, ancak bileşik birincil anahtarın nasıl oluşturulacağını bilmiyorum. Bunu nasıl başarabilirim?


1
Asp.net'te yeniyseniz, bir tavsiye parçası: Kompozit birincil anahtarlar genellikle kötü düşünülmüş bir tasarımı gösteren kötü bir şeydir
smirkingman

47
@smirkingman Çok önemli problemler çözülebilir, genellikle neredeyse tamamen bileşik birincil anahtarlarla. Satırları tek bir tabloya / varlık türüne kaydeden yüzlerce / binlerce kullanıcınız olduğu gibi. Satırların user-id ile ve ardından ikinci bir değerle sıralanmasını istiyorsunuz. Değer yargınız basitçe yanlıştır, değilse, bu özelliği bir süre sonra kullanımdan kaldırırız.
Nicholas Petersen

Yanıtlar:


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
@ Matthew-abbott örneğinde olduğu gibi Birincil Anahtar ile CONSTRAINT kullanımı arasındaki fark nedir ?
mateuscb

28
İsme

14
Pek doğru değil. Her ikisi de "adlandırılmış kısıtlamalar" oluşturur. Sadece öncekiyle, isimlendirmeyi kontrol etmiyorsunuz. Ancak oluşturulduktan sonra, kullanılan adı arayabilir ve ada göre silebilir / güncelleyebilirsiniz ...
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 - Evet, kısıtlamalarınızı adlandırın, aksi takdirde Sql Server, bir sürümün DB'sinde PK_UserGrou_5DEAEAF5 ve diğerinde PK_UserGrou_3214EC0777F66C69 gibi kötü şeyler yapar. Öncelikle db'den adı almak ve daha sonra dinamik sql kullanmak (veya önce kodu kodda oluşturmak) için PK'yi güncellemeniz veya bırakmanız gerekiyorsa bu bir acıdır. Ayrıca, bu çirkin.
monty

2
PK'mın kümelenmesini istemememin bir nedeni var mı?
04:00

1
@ 04:00 Bu soruya cevap verebilir: bağlantı
Dongminator

52

Enterprise Manager (SSMS) aracılığıyla ...

  • Bileşik anahtarı oluşturmak istediğiniz Tabloya sağ tıklayın ve Tasarım'ı seçin .
  • Bileşik anahtar olarak oluşturmak istediğiniz sütunları vurgulayın
  • Bu sütunları sağ tıklayın ve Birincil Anahtarı Ayarlayın

SQL görmek için daha sonra sağ tıklayabilirsiniz Table> Script Table As>Create To


2
Teşekkür ederim. Bu, SQL sözdizimi potansiyel olarak bozmadan en güvenli / en kolay yoldur
AlbatrossCafe

1
Bu, tasarım / kılavuz arayüzü aracılığıyla hızlı düzeltmeyi isteyenler için kolaylaştırır. Yardım için teşekkürler.
Trevor Nestman

32

Bu partiye geç kaldığımı biliyorum, ancak mevcut bir tablo için şunu deneyin:

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

27

MSSQL Server 2012 için

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)
)

GÜNCELLEME

Eklemeliyim!

Değişen yabancı / birincil anahtarlar eklemek istiyorsanız, öncelikle anahtarları kısıtlamalarla oluşturmalısınız veya değişiklik yapamazsınız. Aşağıdaki gibi:

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)
)

Aslında son yol daha sağlıklı ve seri. FK / PK Kısıtlama adlarına bakabilirsiniz (dbo.dbname> Keys> ..), ancak bir kısıtlama kullanmazsanız MSSQL otomatik olarak rasgele FK / PK adları oluşturur. İhtiyacınız olan her değişikliğe (tabloyu değiştir) bakmanız gerekecektir.

Kendiniz için bir standart belirlemenizi tavsiye ederim; kısıtlama standardınıza göre tanımlanmalıdır. Ezberlemeniz gerekmeyecek ve çok uzun düşünmeniz gerekmeyecek. Kısacası, daha hızlı çalışıyorsunuz.


bu PK değil, sadece FK değil mi?
batmaci

@batmaci; Hayır, PK'ya hem FK hem de çift FK grubudur. Bu kullanım daha sağlıklı. Tavsiye ederim. PK oluşturmadığınızda da kullanabilirsiniz.
Fatih Mert Doğancan

1

Önce sütunları elle ekleyerek veritabanını ve tabloyu oluşturun. Hangi sütunda birincil anahtar olacak. Bu sütuna sağ tıklayıp birincil anahtarı ayarlamalı ve birincil anahtarın tohum değerini ayarlamalısınız.


-3

Tabloda birleşik benzersiz anahtar oluşturmak için

ALTER TABLE [TableName] ADD UNIQUE ([Column1], [Column2], [column3]);

-3
CREATE TABLE UserGroup
(
  [User_Id] INT Foreign Key,
  [Group_Id] INT foreign key,

 PRIMARY KEY ([User_Id], [Group_Id])
)

2
biraz açıklama ekle
Abdulla Nilam
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.