Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

MySQL - Bedeutung von PRIMARY KEY, UNIQUE KEY und KEY bei gemeinsamer Verwendung beim Erstellen einer Tabelle

Ein Schlüssel ist nur ein normaler Index. Ein Weg zur Vereinfachung besteht darin, es sich wie einen Zettelkatalog in einer Bibliothek vorzustellen. Es weist MySQL in die richtige Richtung.

Ein eindeutiger Schlüssel wird auch für eine verbesserte Suchgeschwindigkeit verwendet, hat aber die Einschränkung, dass es keine doppelten Elemente geben kann (es gibt keine zwei x und y, wobei x nicht y ist und x ==y).

Das Handbuch erklärt es wie folgt:

Ein UNIQUE-Index erstellt eine Einschränkung, sodass alle Werte im Index eindeutig sein müssen. Ein Fehler tritt auf, wenn Sie versuchen, eine neue Zeile mit einem Schlüsselwert hinzuzufügen, der mit einer vorhandenen Zeile übereinstimmt. Diese Einschränkung gilt nicht für NULL-Werte mit Ausnahme der BDB-Speicher-Engine. Bei anderen Engines erlaubt ein UNIQUE-Index mehrere NULL-Werte für Spalten, die NULL enthalten können. Wenn Sie einen Präfixwert für eine Spalte in einem UNIQUE-Index angeben, müssen die Spaltenwerte innerhalb des Präfixes eindeutig sein.

Ein Primärschlüssel ist ein „spezieller“ eindeutiger Schlüssel. Es ist im Grunde ein eindeutiger Schlüssel, außer dass er verwendet wird, um etwas zu identifizieren.

Das Handbuch erklärt, wie Indizes im Allgemeinen verwendet werden:hier.

In MSSQL sind die Konzepte ähnlich. Es gibt Indizes, Unique Constraints und Primary Keys.

Ungetestet, aber ich glaube, das MSSQL-Äquivalent ist:

CREATE TABLE tmp (
  id int NOT NULL PRIMARY KEY IDENTITY,
  uid varchar(255) NOT NULL CONSTRAINT uid_unique UNIQUE,
  name varchar(255) NOT NULL,
  tag int NOT NULL DEFAULT 0,
  description varchar(255),
);

CREATE INDEX idx_name ON tmp (name);
CREATE INDEX idx_tag ON tmp (tag);

Bearbeiten:Der obige Code wird auf Korrektheit getestet; Ich vermute jedoch, dass es eine viel bessere Syntax dafür gibt. Es ist schon eine Weile her, seit ich SQL Server benutzt habe, und anscheinend habe ich einiges vergessen :).