Database
 sql >> Datenbank >  >> RDS >> Database

Der Unterschied zwischen Primärschlüssel und eindeutigem Schlüssel

"Was ist der Unterschied zwischen einer Primärschlüssel-Einschränkung und einer Eindeutigkeitsschlüssel-Einschränkung?"

Dies ist wahrscheinlich die am häufigsten gestellte Frage in Vorstellungsgesprächen für Datenbankentwickler. In diesem Artikel werden wir versuchen, sie zu beantworten.

Sehen wir uns zunächst an, was Primärschlüssel und eindeutige Schlüssel sind, sowie ihre Ähnlichkeiten.

Primärschlüssel

Ein Primärschlüssel wird verwendet, um jeden Datensatz in der Tabelle eindeutig zu identifizieren. Jede Tabelle muss mindestens einen Primärschlüssel haben. Um einen Primärschlüssel in SQL Server zu definieren, müssten Sie einfach die Schlüsselwörter „Primärschlüssel“ nach dem Namen der Spalte verwenden.

Eindeutiger Schlüssel

Eine Spalte mit einer eindeutigen Schlüsselbeschränkung kann nur eindeutige Werte enthalten – dies ist das Ergebnis des eindeutigen Schlüssels, der verhindert, dass doppelte Werte in einer Spalte gespeichert werden.

Um einen eindeutigen Schlüssel zu definieren, müssen Sie „Unique“ an den Namen des Felds anhängen. Bitte beachten Sie, dass es nicht zwingend erforderlich ist, einen eindeutigen Schlüssel in einer Tabelle zu haben.

Beispiel für das Erstellen von Primärschlüsseln und eindeutigen Schlüsseln

Das folgende Skript erstellt eine „Test“-Datenbank, die eine Tabelle namens „Cars“ enthält.

Diese Tabelle hat eine Primärschlüsselspalte mit dem Namen „ID“ und eine eindeutige Schlüsselspalte mit dem Namen „NumberPlate“.

CREATE DATABASE TEST
GO
USE TEST
GO


CREATE TABLE Cars (
    ID int PRIMARY KEY,
    Name varchar(255) NOT NULL,
    NumberPlate varchar(255) UNIQUE,
    Model int
);

Als Nächstes fügen wir unserer „Cars“-Tabelle ein paar Dummy-Datensätze hinzu. Führen Sie das folgende Skript aus:

INSERT INTO Cars
VALUES 
(1, 'Toyota', 'ABC 123', 199),
(2, 'Toyota', 'ABC 345', 207),
(3, 'Toyota', 'ABC 758', 205),
(4, 'Toyota', 'ABC 741', 306),
(5, 'Toyota', 'ABC 356', 124)

Bevor wir über die Unterschiede sprechen, schauen wir uns zunächst die Ähnlichkeiten zwischen Primär- und eindeutigen Schlüsseln an.

Ähnlichkeiten zwischen primären und eindeutigen Schlüsseln

  1. Spalten mit Primärschlüsseln oder eindeutigen Schlüsseln dürfen keine doppelten Werte haben.

Versuchen wir, einen neuen Datensatz mit einem ID-Wert von 2 (der bereits vorhanden ist) zur Tabelle „Autos“ hinzuzufügen. Führen Sie das folgende Skript aus:

INSERT INTO Cars
VALUES 
(2, 'Toyota', 'ABC 345', 356)

Wenn Sie das obige Skript ausführen, wird der folgende Fehler angezeigt:

Der Fehler besagt eindeutig, dass diese Anweisung die Primärschlüsselbeschränkung verletzt und dass keine doppelten Werte in die Primärschlüsselspalte eingefügt werden können.

Lassen Sie uns auf ähnliche Weise versuchen, einen doppelten Wert in die Spalte „NumberPlate“ mit einer eindeutigen Schlüsselbeschränkung einzufügen, indem Sie die folgende Abfrage verwenden:

INSERT INTO Cars
VALUES 
(6, 'Toyota', 'ABC 345', 356)

Dieses Mal sehen Sie, dass es eine Verletzung der Eindeutigkeitsschlüssel-Einschränkung gibt, da der Wert „ABC 345“ bereits in der Spalte „NumberPlate“ existiert, die eine Eindeutigkeitsschlüssel-Einschränkung hat. Die Fehlermeldung sieht folgendermaßen aus:

  1. Da sowohl Primärschlüssel- als auch eindeutige Spalten keine doppelten Werte akzeptieren, können sie zur eindeutigen Identifizierung eines Datensatzes in der Tabelle verwendet werden. Das bedeutet, dass für jeden Wert in der Primär- oder eindeutigen Schlüsselspalte nur ein Datensatz zurückgegeben wird.

Unterschiede zwischen primären und eindeutigen Schlüsseln

Nachdem wir nun die Ähnlichkeiten zwischen Primär- und eindeutigen Schlüsseln verstanden haben, werfen wir einen Blick auf ihre Unterschiede.

  1. Eine Tabelle kann nur einen Primärschlüssel haben, aber mehrere eindeutige Schlüssel.

Das folgende Beispiel hilft uns, dies besser zu verstehen.

Lassen Sie uns in der zuvor erstellten „Test“-Datenbank eine neue „Cars2“-Tabelle mit zwei Primärschlüsseln erstellen. Führen Sie dazu das folgende Skript aus:

CREATE TABLE Cars2 (
    ID int PRIMARY KEY,
    Name varchar(255) NOT NULL,
    NumberPlate varchar(255) UNIQUE,
    Model int PRIMARY KEY
);

Im obigen Skript legen wir Primärschlüsseleinschränkungen für die ID- und Model-Spalten fest. Da jedoch nur eine Spalte in einer Tabelle eine Primärschlüsseleinschränkung haben kann, sehen Sie den folgenden Fehler:

Diese Fehlermeldung informiert uns eindeutig darüber, dass eine Tabelle nicht mehrere Primärschlüssel-Constraints haben kann.

Lassen Sie uns nun der Tabelle „Cars2“ mehrere eindeutige Schlüsselbeschränkungen hinzufügen. Sehen Sie sich das folgende Skript an:

CREATE TABLE Cars2 (
    ID int PRIMARY KEY,
    Name varchar(255) NOT NULL,
    NumberPlate varchar(255) UNIQUE,
    Model int UNIQUE
);

Dadurch können wir den Spalten „NumberPlate“ und „Model“ eindeutige Schlüsselbeschränkungen hinzufügen. Da eine Tabelle mehrere Spalten mit eindeutigen Schlüsselbeschränkungen haben kann, werden Sie keine Fehlermeldungen sehen, wenn Sie das obige Skript ausführen.

  1. Die Primärschlüsselspalte darf keine Nullwerte haben, während die eindeutige Schlüsselspalte einen Nullwert haben kann.

Sehen wir uns das in Aktion an. Lassen Sie uns zunächst einen Datensatz mit einem Nullwert zu einer Primärschlüsselspalte in der Tabelle „Autos“ hinzufügen. Sehen Sie sich das folgende Skript an:

INSERT INTO Cars
VALUES 
( null, 'Toyota', 'ABC 345', 356)

Sie können sehen, dass dieses Skript null als Wert in die ID-Spalte einfügt. Wenn Sie es ausführen, sollten Sie den folgenden Fehler im Ausgabemeldungsfenster sehen:

Der Fehler teilt uns mit, dass kein Nullwert eingefügt werden kann, da die Primärschlüsselspalte keine Nullwerte zulässt.

Versuchen wir nun, der eindeutigen Schlüsselspalte „NumberPlate“ Nullwerte hinzuzufügen. Führen Sie dazu das folgende Skript aus:

INSERT INTO Cars
VALUES 
( 6, 'Toyota',null, 356)

Dadurch wird der Tabelle „Cars“ ein neuer Datensatz mit einem ID-Wert von 6 und einem Nullwert hinzugefügt – insbesondere wird der Spalte „NumberPlate“ der Nullwert zugewiesen. Sie werden sehen, dass das obige Skript ohne Fehler ausgeführt wird, da die eindeutige Schlüsselspalte standardmäßig Nullwerte akzeptieren kann.

Um zu überprüfen, ob der Nullwert tatsächlich in die Spalte „NumberPlate“ eingefügt wurde, müssen wir mithilfe des folgenden Skripts alle Datensätze aus der Tabelle „Cars“ auswählen:

SELECT * FROM Cars


In der obigen Ergebnismenge können wir deutlich sehen, dass die Primärschlüsselspalte „ID“ dies tut keine Nullwerte enthalten. Andererseits enthält die Spalte „NumberPlate“ mit einer eindeutigen Schlüsselbeschränkung einen Nullwert, den wir gerade eingefügt haben. Denken Sie daran, dass Sie einer eindeutigen Schlüsselspalte nicht mehr als einen Nullwert hinzufügen können, da der zweite Nullwert das Duplikat des ersten ist – und Duplikate sind nicht zulässig.

  1. Standardmäßig wird ein eindeutiger gruppierter Index für die Primärschlüsselspalte erstellt; Andererseits wird ein eindeutiger, nicht geclusterter Index für die eindeutige Schlüsselspalte erstellt.

Führen Sie das folgende Skript aus, um die Indizes der Tabelle „Autos“ anzuzeigen:

USE TEST
GO
sp_help Cars

In der Ausgabe sehen Sie Details der Tabelle „Autos“ einschließlich der Indizes, wie in der folgenden Abbildung gezeigt:

Aus der obigen Abbildung können Sie ersehen, dass die Spalte „NumberPlate“ einen nicht geclusterten eindeutigen Index hat, während die ID-Spalte einen geclusterten eindeutigen Index hat.

Schlussfolgerung

Trotz einiger grundlegender Ähnlichkeiten weisen Primär- und eindeutige Schlüssel erhebliche Unterschiede auf. Sie können nur einen Primärschlüssel pro Tabelle haben, aber mehrere eindeutige Schlüssel. Ebenso akzeptiert eine Primärschlüsselspalte keine Nullwerte, während eindeutige Schlüsselspalten jeweils einen Nullwert enthalten können. Und schließlich hat die Primärschlüsselspalte einen eindeutigen gruppierten Index, während eine eindeutige Schlüsselspalte einen eindeutigen nicht gruppierten Index hat.