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

So fügen Sie einer vorhandenen Tabelle in SQL Server einen Primärschlüssel hinzu (T-SQL-Beispiele)

In diesem Artikel wird veranschaulicht, wie Sie mithilfe von Transact-SQL einen Primärschlüssel zu einer vorhandenen Tabelle in SQL Server hinzufügen.

Ein Primärschlüssel ist eine Spalte, die als eindeutige Kennung für eine bestimmte Tabelle konfiguriert wurde.

Normalerweise würden Sie beim Erstellen der Tabelle eine Primärschlüsseleinschränkung erstellen, aber Sie können auch einer vorhandenen Tabelle einen Primärschlüssel hinzufügen.

Beachten Sie, dass eine Tabelle nur einen Primärschlüssel haben kann. Sie können also keinen Primärschlüssel hinzufügen, wenn die Tabelle bereits einen hat.

Außerdem können Primärschlüssel nur zu Spalten hinzugefügt werden, die als NOT NULL definiert sind .

Beispiel 1 – Fügen Sie eine Primärschlüsselbeschränkung hinzu

In diesem Beispiel erstelle ich eine Tabelle, aber ich vergesse, eine Primärschlüsseleinschränkung hinzuzufügen. Also gehe ich zurück und ändere die Tabelle so, dass sie einen Primärschlüssel hat.

Erstellen Sie die Tabelle (aber vergessen Sie, einen Primärschlüssel zu erstellen ):

USE Test;

CREATE TABLE Colors
(
    ColorId int IDENTITY (1,1) NOT NULL,
    ColorName varchar(50)
);

Ergebnis:

Commands completed successfully.
Total execution time: 00:00:00.058

Hoppla – ich habe vergessen, den Primärschlüssel zu erstellen!

Kein Problem! Wir können jetzt einen hinzufügen:

ALTER TABLE Colors
ADD CONSTRAINT PK_Colors_ColorId PRIMARY KEY CLUSTERED (ColorId);

Ergebnis:

Commands completed successfully.
Total execution time: 00:00:00.031

Dies hat nun einen PRIMARY KEY hinzugefügt Einschränkung für die ColorId Säule.

Beispiel 2 – Überprüfung der Primärschlüsselbeschränkung

Lassen Sie uns den folgenden Code ausführen, um eine Liste der Primärschlüsseleinschränkungen in der Datenbank zurückzugeben:

SELECT
  name,
  type,
  unique_index_id,
  is_system_named
FROM sys.key_constraints
WHERE type = 'PK';

Ergebnis:

+------------------------------+--------+-------------------+-------------------+
| name                         | type   | unique_index_id   | is_system_named   |
|------------------------------+--------+-------------------+-------------------|
| PK__MyTest__606C418F16F9CCCF | PK     | 1                 | 1                 |
| PK__Client__96ADCE1ACB91C2A9 | PK     | 1                 | 1                 |
| PK_Colors_ColorId            | PK     | 1                 | 0                 |
+------------------------------+--------+-------------------+-------------------+

Ihre Ergebnisse werden je nach den Primärschlüsseln in Ihrer Datenbank unterschiedlich sein.

Beachten Sie auch, dass diese Systemansicht mehr Spalten zurückgibt, als ich hier angegeben habe, aber Sie können den * verwenden Platzhalter, um auf Wunsch alle Spalten zurückzugeben.

Beispiel 3 – Hinzufügen eines Primärschlüssels zu einer Spalte, die NULL-Werte zulässt

Ein Primärschlüssel kann nur Spalten hinzugefügt werden, die als NOT NULL definiert sind . Wenn Sie versuchen, einen Primärschlüssel zu einer Spalte hinzuzufügen, die nullfähig ist, erhalten Sie eine Fehlermeldung.

Um dies zu demonstrieren, erstellen wir eine weitere Tabelle, aber diesmal vergessen wir auch, die Spalte als NOT NULL anzugeben :

USE Test;

CREATE TABLE Colors2
(
    ColorId int,
    ColorName varchar(50)
);

Wir können die folgende Abfrage ausführen, um zu prüfen, ob die Spalte Nullen zulässt oder nicht:

SELECT 
  t.name AS 'Table',
  c.name AS 'Column', 
  c.is_nullable,
  c.is_identity
FROM sys.columns c
INNER JOIN sys.tables T
ON c.object_id = t.object_id
WHERE c.name = 'ColorId';

Ergebnis:

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Colors  | ColorId  | 0             | 1             |
| Colors2 | ColorId  | 1             | 0             |
+---------+----------+---------------+---------------+

Wir können sehen, dass die, die wir zuvor erstellt haben (in der Datei Colors table) ist nullable und ist eine Identitätsspalte. Die zweite (in der Colors2 table) ist nullable und ist keine Identitätsspalte.

Versuchen wir nun, der Nullable-Spalte eine Primärschlüssel-Einschränkung hinzuzufügen:

ALTER TABLE Colors2
ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);

Ergebnis:

Msg 8111, Level 16, State 1, Line 1
Cannot define PRIMARY KEY constraint on nullable column in table 'Colors2'.
Msg 1750, Level 16, State 0, Line 1
Could not create constraint or index. See previous errors.

In diesem Fall müssen wir also die Spalte so ändern, dass sie NOT NULL ist bevor wir versuchen, ihn als Primärschlüssel zu definieren.

Wir können ALTER COLUMN verwenden innerhalb einer ALTER TABLE -Anweisung, um diese Spalte auf NOT NULL zu setzen :

ALTER TABLE Colors2
ALTER COLUMN ColorId int NOT NULL;

Sehen wir uns die Spalte noch einmal an:

SELECT 
  t.name AS 'Table',
  c.name AS 'Column', 
  c.is_nullable,
  c.is_identity
FROM sys.columns c
INNER JOIN sys.tables T
ON c.object_id = t.object_id
WHERE c.name = 'ColorId';

Ergebnis:

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Colors  | ColorId  | 0             | 1             |
| Colors2 | ColorId  | 0             | 0             |
+---------+----------+---------------+---------------+

Also können wir diese Colors2 sehen ist jetzt auf 0 gesetzt , was bedeutet, dass es nicht nullable ist (es kann keine NULL-Werte enthalten).

Beachten Sie auch, dass die Spalte nicht ist eine Identitätsspalte. Ich werde das später besprechen.

Wie auch immer, jetzt, wo die Spalte als NOT NULL definiert ist Wir können fortfahren und den Primärschlüssel hinzufügen:

ALTER TABLE Colors2
ADD CONSTRAINT PK_Colors2_ColorId PRIMARY KEY CLUSTERED (ColorId);

Ergebnis:

Commands completed successfully.
Total execution time: 00:00:00.048

Lassen Sie uns zur Überprüfung noch einmal alle Primärschlüsseleinschränkungen für diese Tabelle überprüfen:

SELECT
  name,
  type,
  unique_index_id,
  is_system_named
FROM sys.key_constraints
WHERE type = 'PK';

Ergebnis:

+------------------------------+--------+-------------------+-------------------+
| name                         | type   | unique_index_id   | is_system_named   |
|------------------------------+--------+-------------------+-------------------|
| PK__MyTest__606C418F16F9CCCF | PK     | 1                 | 1                 |
| PK__Client__96ADCE1ACB91C2A9 | PK     | 1                 | 1                 |
| PK_Colors_ColorId            | PK     | 1                 | 0                 |
| PK_Colors2_ColorId           | PK     | 1                 | 0                 |
+------------------------------+--------+-------------------+-------------------+

Unser neuer Primärschlüssel, den wir PK_Colors2_ColorId genannt haben wurde der Liste hinzugefügt.

Beispiel 4 – Ändern einer Spalte in eine Identitätsspalte

Primärschlüssel werden häufig auf Identitätsspalten angewendet. Identitätsspalten werden als solche mit dem IDENTITY definiert Schlüsselwort, gefolgt von einem optionalen Anfangs- und Inkrementwert in Klammern.

Wenn der Tabelle eine neue Zeile hinzugefügt wird, stellt SQL Server einen eindeutigen, inkrementellen Wert für die Identitätsspalte bereit.

Wenn Sie eine Identitätsspalte verwenden möchten, müssen Sie dies bereits getan haben. Sie können eine vorhandene Spalte nicht in eine Identitätsspalte ändern.

Als ich die Abfrage früher ausgeführt habe, konnten wir sehen, dass die Colors2.ColorId Spalte ist nicht eine Identitätsspalte (wir wissen das, weil is_identity auf 0 gesetzt ist ). Das heißt, ich habe die PK_Colors2_ColorId erstellt Primärschlüssel für eine Nicht-Identitätsspalte.

Folgendes passiert, wenn wir versuchen, die Tabelle in eine Identitätsspalte zu ändern:

ALTER TABLE Colors2
ALTER COLUMN 
  ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY;

Ergebnis:

Msg 156, Level 15, State 1, Line 3
Incorrect syntax near the keyword 'IDENTITY'.

Wie bereits erwähnt, müssen wir, um dies zu überwinden, die Säule fallen lassen und neu beginnen.

Wenn die Spalte bereits Daten enthält, müssen Sie zusätzliche Arbeit leisten. Das würde den Rahmen dieses Artikels sprengen, aber hier ist ein Beispiel dafür, wie die obige Spalte gelöscht und als Identitätsspalte neu erstellt wird:

USE Test; 

DROP TABLE Colors2;

CREATE TABLE Colors2
(
    ColorId int IDENTITY (1,1) NOT NULL PRIMARY KEY,
    ColorName varchar(50)
);

Ergebnis:

Commands completed successfully.
Total execution time: 00:00:00.049

Beachten Sie, dass ich dieses Mal keinen Namen für die Primärschlüsseleinschränkung angegeben habe. In diesem Fall erstellt das System einen Namen dafür.

Überprüfen Sie schnell die Spalte:

SELECT 
  t.name AS 'Table',
  c.name AS 'Column', 
  c.is_nullable,
  c.is_identity
FROM sys.columns c
INNER JOIN sys.tables T
ON c.object_id = t.object_id
WHERE c.name = 'ColorId';

Ergebnis:

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Colors  | ColorId  | 0             | 1             |
| Colors2 | ColorId  | 0             | 1             |
+---------+----------+---------------+---------------+

Ja, es ist jetzt eine Identitätsspalte.

Sehen wir uns noch einmal die Primärschlüssel für diese Tabelle an:

SELECT
  name,
  type,
  unique_index_id,
  is_system_named
FROM sys.key_constraints
WHERE type = 'PK';

Ergebnis:

+-------------------------------+--------+-------------------+-------------------+
| name                          | type   | unique_index_id   | is_system_named   |
|-------------------------------+--------+-------------------+-------------------|
| PK__MyTest__606C418F16F9CCCF  | PK     | 1                 | 1                 |
| PK__Client__96ADCE1ACB91C2A9  | PK     | 1                 | 1                 |
| PK_Colors_ColorId             | PK     | 1                 | 0                 |
| PK__Colors2__8DA7674D8F57294D | PK     | 1                 | 1                 |
+-------------------------------+--------+-------------------+-------------------+

Wir haben jetzt also einen vom System benannten Primärschlüssel namens PK__Colors2__8DA7674D8F57294D .