Was ist der Unterschied zwischen einem Primärschlüssel und einer Identität?

72

Was ist in einer SQL Server-Datenbank der Unterschied zwischen einem Primärschlüssel und einer Identitätsspalte? Eine Spalte kann ein Primärschlüssel sein, ohne eine Einrückung zu sein. Eine Spalte kann jedoch keine Identität sein, ohne ein Primärschlüssel zu sein.

Was bietet eine PK- und Identitätsspalte zusätzlich zu den Unterschieden, was nur eine PK-Spalte nicht bietet?

bearbeiten: Ups. Wie unten ausgeführt und jetzt von mir verifiziert, kann eine Spalte eine Identität sein, ohne eine PK zu sein. Als ich dies testete, war mein Spaltentyp eine Zeichenfolge und ich konnte keine Identität festlegen. Macht Sinn.

DenaliHardtail
quelle

Antworten:

88

Eine Spalte kann definitiv eine Identität sein, ohne eine PK zu sein.

Eine Identität ist einfach eine automatisch zunehmende Spalte.

Ein Primärschlüssel ist die eindeutige Spalte oder die eindeutigen Spalten, die die Zeile definieren.

Diese beiden werden oft zusammen verwendet, aber es ist nicht erforderlich, dass dies so ist.

Joe
quelle
1
Eigentlich glaube ich, dass SQL Server dies erfordert, andere Datenbanken jedoch möglicherweise nicht.
Erik Funkenbusch
8
Ich bin mir zu 99% sicher, dass dies nicht der Fall ist, habe aber keinen Zugriff auf eine zu bestätigende Instanz.
Joe
1
Dann in die falsche Erstellungs-Tabelle eingefügt. Dieser arbeitet mit der Nichtidentitätsspalte als PK ... create table pktest (nonpk int identity (1,1), pk int Primärschlüssel nicht null)
KenJ
3
+1 gute Antwort. PK muss keine automatisch inkrementierende Zahl sein, aber es muss ein eindeutiger Wert für jeden Eintrag sein. Um eine PK zu verwenden, die keine Identität ist, müssen möglicherweise zuerst alle neu eingegebenen Identitäten mit den bereits in der Tabelle vorhandenen Identitäten überprüft werden.
Evan Plaice
1
SQL Server lehnt einen doppelten Eintrag für einen Primay-Schlüssel ab, schneller als jede Prüfung, die wir auf doppelte schreiben könnten. Wir behandeln die Ablehnung im Code, sodass wir tatsächlich nach doppelten Einträgen gesucht haben.
RC_Cleland
13

Diese Antwort ist mehr von WARUM Identität und Primay-Schlüssel als WAS sie sind, da Joe oben WAS richtig beantwortet hat.

Eine Identität ist ein Wert, den Sie von SQL steuern. Identität ist eine Zeilenfunktion. Der Wert wird sequentiell erhöht oder verringert, zumindest in SQL Server. Es sollte niemals geändert werden und Lücken im Wert sollten ignoriert werden. Identitätswerte sind sehr nützlich beim Verknüpfen von Tabelle B mit Tabelle A, da der Wert niemals dupliziert wird. Die Identität ist nicht in jedem Fall die beste Wahl für einen Clustered-Index. Wenn eine Tabelle Überwachungsdaten enthält, wird der Clustered-Index möglicherweise besser zum Zeitpunkt des Auftretens erstellt, da er die Antwort auf die Frage "Was ist zwischen heute und vor vier Tagen passiert?" Mit weniger Arbeit darstellt, da die Datensätze für die Daten im Datenseiten.

Ein Primärschlüssel macht die Spalte oder Spalten in einer Zeile eindeutig. Der Primay-Schlüssel ist eine Spaltenfunktion. In jeder Tabelle darf nur ein Primay-Schlüssel definiert werden, es können jedoch mehrere eindeutige Indizes erstellt werden, die den Primärschlüssel simulieren. Das Clustering des Primärschlüssels ist nicht immer die richtige Wahl. Betrachten Sie ein Telefonbuch. Wenn das Telefonbuch mit dem Primay-Schlüssel (Telefonnummer) gruppiert ist, ist die Abfrage zur Rückgabe der Telefonnummern in "First Street" sehr kostspielig.

Die allgemeinen Regeln, die ich für Identität und Primärschlüssel befolge, sind:

  1. Verwenden Sie immer eine Identitätsspalte
  2. Erstellen Sie den Clustered-Index für die Spalte (n), die bei der Suche nach Bereichen verwendet werden
  3. Halten Sie den Clustered-Index eng, da der Clustered-Index am Ende jedes anderen Index hinzugefügt wird
  4. Erstellen Sie einen Primay-Schlüssel und eindeutige Indizes, um doppelte Werte abzulehnen
  5. Schmale Tasten sind besser
  6. Erstellen Sie einen Index für jede Spalte oder Spalten, die in Verknüpfungen verwendet werden

Dies sind meine ALLGEMEINEN Regeln.

RC_Cleland
quelle
1
Sie erwähnen, dass Identitätswerte niemals dupliziert werden. Sie können dupliziert werden, wenn sie manuell eingefügt oder neu ausgesät werden ( subhrosaha.wordpress.com/2012/11/14/… ). Wenn Sie die Eindeutigkeitsbeschränkung garantieren möchten, muss z. B. ein eindeutiger Index zu Spalte (n) hinzugefügt werden.
Breitband
8

Ein Primärschlüssel (auch als Kandidatenschlüssel bezeichnet) ist ein beliebiger Satz von Attributen, die die Eigenschaften Eindeutigkeit und Minimalität aufweisen. Das bedeutet, dass die Schlüsselspalte oder -spalten eindeutig sein müssen. Mit anderen Worten, das DBMS lässt nicht zu, dass zwei Zeilen denselben Wertesatz für diese Attribute haben.

Die IDENTITY-Eigenschaft erstellt effektiv einen automatisch inkrementierenden Standardwert für eine Spalte. Diese Spalte muss jedoch nicht eindeutig sein, daher ist eine IDENTITY-Spalte nicht unbedingt ein Schlüssel.

Eine IDENTITY-Spalte soll jedoch normalerweise als Schlüssel verwendet werden, und daher unterliegt sie normalerweise einer Eindeutigkeitsbeschränkung, um sicherzustellen, dass Duplikate nicht zulässig sind.

nvogel
quelle
5
Es scheint also, dass das Wort "Identität" in diesem Fall eine Art Fehlbezeichnung ist, da es nicht immer eindeutig ist, wie Sie betont haben, wie andere auch . Ihre Antwort hilft denjenigen, die mehr Erfahrung mit MySql haben, die Identitätseigenschaft von Sql Server besser zu verstehen, indem sie betont, dass lediglich ein automatisch inkrementierender Standardwert für eine Spalte erstellt wird und daher der Eigenschaft AUTO_INCREMENT von MySql entspricht . Vielen Dank.
Jason Frank
1

BEARBEITUNGEN AUF DER GRUNDLAGE VON FEEDBACK

Ein Schlüssel ist für eine Zeile eindeutig. Es ist eine Möglichkeit, eine Zeile zu identifizieren. Zeilen können keine, eine oder mehrere Tasten haben. Diese Schlüssel können aus einer oder mehreren Spalten bestehen.

Schlüssel sind Indizes mit einer eindeutigen Einschränkung. Dies unterscheidet sie von Nicht-Schlüsselindizes.

Jeder Index mit mehreren Spalten wird als "zusammengesetzter Index" bezeichnet.

Traditionell wird ein Primärschlüssel als Hauptschlüssel angesehen, der eine Zeile eindeutig identifiziert. Möglicherweise gibt es nur eine davon.

Abhängig vom Design der Tabelle hat man möglicherweise keinen Primärschlüssel.

Ein Primärschlüssel ist genau das - ein "Primschlüssel". Es ist die Hauptidentität, die die eindeutige Identität einer Zeile angibt. Abhängig vom Design einer Tabelle kann dies eine Fehlbezeichnung sein, und mehrere Schlüssel drücken die Einzigartigkeit aus.

In SQL Server kann ein Primärschlüssel geclustert werden. Dies bedeutet, dass die verbleibenden Spalten auf Blattebene des Index an diesen Schlüssel angehängt werden. Mit anderen Worten, sobald SQL Server den Schlüssel gefunden hat, hat es auch die Zeile gefunden (um klar zu sein, liegt dies am Cluster- Aspekt).

Eine Identitätsspalte ist einfach eine Methode zum Generieren einer eindeutigen ID für eine Zeile.

Diese beiden werden oft zusammen verwendet, dies ist jedoch keine Voraussetzung.

IamIC
quelle
1
Für SQL Server muss der Primärschlüssel kein Clustered-Index sein.
RC_Cleland
1
@IanC: "Der Grund, warum es als Primär bezeichnet wird, ist, dass dies der Schlüssel ist, der die Zeile eindeutig identifiziert." Dies ist keine wirkliche Erklärung, da JEDER Schlüssel oder ein beliebiger Superschlüssel eine Zeile eindeutig identifiziert, nicht nur den "Primärschlüssel". "Primär" bedeutet eigentlich nur einen "bevorzugten" oder "speziellen" Schlüssel - obwohl er nur so speziell ist, wie Sie es möchten.
Nvogel
1
@IanC: Die Gefahr besteht darin, dass eine nicht informierte Person durch die Beschreibung den Eindruck erweckt, dass es nur einen solchen Schlüssel in einer Tabelle geben kann oder sollte, was offensichtlich falsch ist.
Nvogel
1
@IanC: Da es häufig vorkommt, dass Dinge mehr als eine Kennung haben und manchmal unterschiedliche Schlüssel von unterschiedlichen Benutzern der Datenbank benötigt werden (Entwickler arbeiten beispielsweise häufig mit unterschiedlichen Schlüsseln für die Endbenutzer). Grundsätzlich können alle Kandidatenschlüssel die gleiche Funktion erfüllen. Es ist also nicht besonders aussagekräftig zu sagen, dass wir nur einen Primärschlüssel haben können oder müssen oder dass der Primärschlüssel in irgendeiner grundlegenden Weise etwas Besonderes ist.
Nvogel
1
Ich sagte, eine Tabelle kann mehrere Kandidatenschlüssel haben. Schlüssel bedeutet Kandidatenschlüssel und "Primärschlüssel" (wenn es überhaupt etwas Besonderes bedeutet) bedeutet nur "einer der Kandidatenschlüssel". SQL Server erlaubt, wie alle mir bekannten DBMS, mehrere Schlüssel pro Tabelle. SQL bietet zwei Eindeutigkeitsbeschränkungen für die Implementierung von Schlüsseln: PRIMARY KEY und UNIQUE (natürlich für nicht nullfähige Spalten). Beide Arten von Schlüsselbeschränkungen erfüllen genau den gleichen Zweck.
Nvogel
1

Sie können IDENTITY nicht nur für Ganzzahlen verwenden, sondern auch für jeden numerischen Datentyp mit einer Skala von 0

Der Primärschlüssel kann skaliert werden, ist jedoch nicht erforderlich.

Mit IDENTITY können Sie in Kombination mit einer PRIMARY KEY- oder UNIQUE-Einschränkung eine einfache eindeutige Zeilen-ID angeben

Nikki
quelle
0

Primärschlüssel mit Schwerpunkt auf Eindeutigkeit und Vermeidung von Duplizierungswerten für alle Datensätze in derselben Spalte, während Identität zunehmende Zahlen in einer Spalte bereitstellt, ohne Daten einzufügen. Beide Funktionen können sich auf einer einzelnen Spalte oder auf einer Differenzspalte befinden.

Shaahin
quelle