Wird empfohlen, Identität als Alternative zum Primärschlüssel zu verwenden?

11

Wir können ein IdentityLike deklarieren, id_numso dass id_numein Inkrement von eindeutigen Zahlen vorliegt.

CREATE TABLE new_employees
(
  id_num int IDENTITY(1,1),
  fname varchar (20),
  minit char(1),
  lname varchar(30)
)

Ist es zu benutzen empfohlen Identityals Alternative zu , Primary keyda Identityeine eindeutige Nummer für jede Zeile zur Verfügung gestellt?

Jack
quelle
Warum müssen Sie das tun? Da es gut ist, ein Primärschlüssel in der Tabelle zu sein, wird automatisch ein Clusterindex erstellt und die Optimierung ermöglicht.
KuldipMCA
4
Nein, es wird empfohlen, IDENTITY als Primärschlüssel zu verwenden (nicht als Alternative zu einer PK). Dies ergibt einen sehr guten, sehr effizienten Primärschlüssel (der standardmäßig auch der Clustering-Schlüssel in SQL Server ist) - er ist eng, normalerweise statisch, normalerweise eindeutig (es sei denn, Sie spielen mit der Identitätsspezifikation herum) und er ist immer steigend
marc_s

Antworten:

23

Identity columnsund Primary Keyssind zwei sehr unterschiedliche Dinge. An Identity columngibt eine automatisch inkrementierende Nummer an. Das ist alles was es tut. Der Primary Key(zumindest in SQL Server) ist eine eindeutige Einschränkung, die die Eindeutigkeit garantiert und normalerweise (aber nicht immer) der Clusterschlüssel ist. Auch in MS SQL Server handelt es sich um einen Index (in einigen RDBMS sind sie nicht so eng miteinander verbunden). Als Index bietet es schnellere Suchvorgänge usw. Wird häufig Identity columnsverwendet, Primary Keywenn kein Gut natural keyvorhanden ist, ist aber kein Ersatz.

Kenneth Fisher
quelle
1
In SQL Server enthält ein nicht gruppierter Index den Primärschlüssel auf Blattebene. Wenn Sie einen natürlichen Schlüssel als Primärschlüssel festlegen, werden Ihre Indizes sehr groß.
Andomar
2
@Andomar eine PK ist eine logische Entität. Der unterstützende Index für die PK ist physisch. Und ein nicht gruppierter Index kann eine PK unterstützen, muss nicht unbedingt ein gruppierter Index sein. Daher ist Ihre Aussage falsch, wenn der PK-Index ein NCI ist. Dies ist der Clustered-Index-Schlüssel auf Blattebene von NCIs.
Thomas Stringer
@ ThomasStringer: Du hast recht, mein Kommentar sollte dort lesen, clustered index keywo er steht primary key.
Andomar
Möglicherweise. Ihr natürlicher Schlüssel könnte eine Ganzzahl sein. In diesem Fall gibt es keinen Unterschied. Die Anzahl der Argumente, die Sie auf künstlichen und natürlichen Schlüsseln sehen, ist atemberaubend. Versuchen Sie es irgendwann einmal im Internet :) Das ist zufällig eines der Argumente für künstliche Schlüssel.
Kenneth Fisher
5

Nein , es ist nicht, weil Identität nicht nicht einen eindeutigen Wert garantieren. Die Identitätseigenschaft kann umgangen werden SET IDENTITY_INSERT <schema>.<table> ON(in SQL Server - Sie haben nicht angegeben, welches RDBMS Sie verwenden).

Eine Primärschlüsseleinschränkung (und eine eindeutige Einschränkung) verwendet einen eindeutigen Index, um die Eindeutigkeit zu erzwingen .

Greenstone Walker
quelle
5
Es garantiert keinen eindeutigen Wert. Aber sonst auch nichts. Jeder, der Zugriff auf die Datenbank hat, kann versuchen, doppelte Werte in einen Primärschlüssel einzufügen. Eine Identität erleichtert die Generierung eindeutiger Werte (insbesondere, wenn Sie keinen guten natürlichen Schlüssel haben, wie Kenneth Fisher sagt). Sie könnten ein ganzzahliges Feld mit Primärschlüssel deklarieren, und es wäre genau dasselbe, jedoch ohne automatische Generierung. Die IDENTITÄT dient also der Generierung und der Schlüssel der Durchsetzung der Eindeutigkeit.
Chris Aldrich
+1 Für den Hinweis auf den grundlegenden Fehler in der Prämisse der Frage - Identityund Primary Keysind nicht gleichwertig und dienen zwei unterschiedlichen Zwecken.
JNK