web-dev-qa-db-de.com

Primär- und Fremdschlüssel gleichzeitig

Wäre es in SQL Server 2008 möglich, eine Tabelle mit zwei Spalten zu erstellen, die gleichzeitig Primär- und Fremdschlüssel sind? Wenn ja, wie würde ein solcher Code aussehen? Ich habe gesucht und nichts gefunden.

38
Eduard Luca

Sicher kein Problem:

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

Dies wird häufig verwendet, um viele-zu-viele-Beziehungen zu modellieren.

54

Dies sind völlig unterschiedliche Konstrukte.

Ein Primärschlüssel wird verwendet, um die Eindeutigkeit in einer Tabelle zu erzwingen und eine eindeutige Kennung für einen bestimmten Datensatz zu sein.

Ein Fremdschlüssel wird für die referenzielle Integrität verwendet, um sicherzustellen, dass ein Wert in einer anderen Tabelle vorhanden ist.

Der Fremdschlüssel muss auf den Primärschlüssel in einer anderen Tabelle verweisen.

Wenn Sie einen Fremdschlüssel haben möchten, der ebenfalls eindeutig ist, können Sie eine FK-Einschränkung erstellen und demselben Feld einen eindeutigen Index/eine eindeutige Einschränkung hinzufügen.

Zu Referenzzwecken lässt SQL Server zu, dass sich ein FK sowohl auf ein UNIQUE CONSTRAINT - als auch auf ein PRIMARY KEY - Feld bezieht.

8
JNK

Dies ist wahrscheinlich keine gute Idee, da Sie häufig doppelte Fremdschlüssel in der Tabelle zulassen möchten. Auch wenn Sie dies jetzt nicht tun, tun Sie dies in Zukunft am besten nicht. Siehe Ist es in Ordnung, einen Fremdschlüssel als Primärschlüssel zu haben?

3

Nur eine kurze Notiz - von Microsoft-Seiten ( http://msdn.Microsoft.com/en-us/library/ms189049.aspx ) ...

"Eine Fremdschlüsseleinschränkung muss nicht nur mit einer Primärschlüsseleinschränkung in einer anderen Tabelle verknüpft sein. Sie kann auch definiert werden, um auf die Spalten einer EINZIGARTIGEN Einschränkung in einer anderen Tabelle zu verweisen."

Nicht oft verwendet, aber unter bestimmten Umständen nützlich.

1
KeithFearnley