Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment créer une clé primaire dans SQL Server (exemples T-SQL)

Cet article montre comment créer une clé primaire dans SQL Server lors de la création d'une table à l'aide de Transact-SQL.

Une clé primaire est une ou plusieurs colonnes qui ont été configurées comme identifiant unique pour une table donnée. Les clés primaires peuvent être utilisées pour renforcer l'intégrité des données dans la table.

Une table ne peut avoir qu'une seule clé primaire, et les clés primaires ne peuvent être ajoutées qu'aux colonnes définies comme NOT NULL .

Cet article montre comment créer une clé primaire dans un nouveau table (c'est-à-dire lors de la création de la table). Si vous avez besoin de créer une clé primaire dans un existant table, consultez Comment ajouter une clé primaire à une table existante dans SQL Server.

Exemple 1 - Créer une table avec une clé primaire

Je vais d'abord créer une base de données de test :

CREATE DATABASE PK_Test;

Créez maintenant une nouvelle table qui inclut une contrainte de clé primaire :

USE PK_Test;

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

Cela a créé une nouvelle table appelée Colors qui a une contrainte de clé primaire sur son ColorId colonne.

Exemple 2 - Vérifier la contrainte de clé primaire

Nous pouvons exécuter le code suivant pour renvoyer une liste de contraintes de clé primaire dans la base de données :

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

Résultat :

+------------------------------+--------+-------------------+-------------------+
| name                         | type   | unique_index_id   | is_system_named   |
|------------------------------+--------+-------------------+-------------------|
| PK__Colors__8DA7674DD34F4585 | PK     | 1                 | 1                 |
+------------------------------+--------+-------------------+-------------------+

J'ai réduit les colonnes pour cet exemple. Les sys.key_constraints la vue système renvoie plus de colonnes que cela. Vous pouvez toujours utiliser le * caractère générique pour renvoyer toutes les colonnes si vous le souhaitez.

Nous pouvons voir par le résultat de la requête que cette base de données n'a qu'une seule clé primaire (celle que nous venons de créer).

Dans ce cas, la clé primaire a été automatiquement nommée par le système. Vous avez également la possibilité de fournir votre propre nom (plus à ce sujet plus tard).

Exemple 3 - Vérifier l'index

Par défaut, un index clusterisé est créé lorsque vous créez la clé primaire. Vous pouvez spécifier explicitement l'index clusterisé ou le laisser être créé automatiquement. Vous avez également la possibilité de spécifier un index non clusterisé.

Voici une requête qui renvoie l'index qui a été créé automatiquement lorsque j'ai créé la clé primaire ci-dessus :

SELECT *
FROM sys.indexes
WHERE name = 'PK__Colors__8DA7674DD34F4585';

Résultat (en utilisant la sortie verticale) :

object_id                  | 885578193
name                       | PK__Colors__8DA7674DD34F4585
index_id                   | 1
type                       | 1
type_desc                  | CLUSTERED
is_unique                  | 1
data_space_id              | 1
ignore_dup_key             | 0
is_primary_key             | 1
is_unique_constraint       | 0
fill_factor                | 0
is_padded                  | 0
is_disabled                | 0
is_hypothetical            | 0
is_ignored_in_optimization | 0
allow_row_locks            | 1
allow_page_locks           | 1
has_filter                 | 0
filter_definition          | NULL
compression_delay          | NULL
suppress_dup_key_messages  | 0
auto_created               | 0

Dans ce cas, j'ai réduit les résultats à la ligne contenant le même nom que la clé primaire que je viens de créer. Vous pouvez toujours supprimer le WHERE clause si vous avez besoin de plus de résultats à renvoyer.

Nous pouvons voir que cet index a un type_desc de CLUSTERED .

Exemple 4 - Nommer la clé primaire

La clé primaire que nous avons créée ci-dessus a été automatiquement nommée par le système. Vous pouvez fournir votre propre nom si vous préférez.

Voici un exemple de spécification d'un nom pour la clé primaire. Dans ce cas, je spécifie également un index non clusterisé.

USE PK_Test;

CREATE TABLE Cats
(
    CatId int IDENTITY (1,1) NOT NULL, 
       CONSTRAINT PK_Cats_CatId PRIMARY KEY NONCLUSTERED (CatId),
    CatName varchar(50)
);

Dans ce cas, j'utilise l'option CONSTRAINT mot-clé pour indiquer le début de la définition de la clé primaire, suivi du nom que j'ai choisi pour la clé primaire. J'utilise aussi le NONCLUSTERED mot-clé pour spécifier qu'un index non clusterisé.

Vérifiez la clé primaire :

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

Résultat :

+------------------------------+--------+-------------------+-------------------+
| name                         | type   | unique_index_id   | is_system_named   |
|------------------------------+--------+-------------------+-------------------|
| PK__Colors__8DA7674DD34F4585 | PK     | 1                 | 1                 |
| PK_Cats_CatId                | PK     | 2                 | 0                 |
+------------------------------+--------+-------------------+-------------------+

Vérifiez l'index :

SELECT *
FROM sys.indexes
WHERE name = 'PK_Cats_CatId';

Résultat (en utilisant la sortie verticale) :

object_id                  | 917578307
name                       | PK_Cats_CatId
index_id                   | 2
type                       | 2
type_desc                  | NONCLUSTERED
is_unique                  | 1
data_space_id              | 1
ignore_dup_key             | 0
is_primary_key             | 1
is_unique_constraint       | 0
fill_factor                | 0
is_padded                  | 0
is_disabled                | 0
is_hypothetical            | 0
is_ignored_in_optimization | 0
allow_row_locks            | 1
allow_page_locks           | 1
has_filter                 | 0
filter_definition          | NULL
compression_delay          | NULL
suppress_dup_key_messages  | 0
auto_created               | 0

Nous pouvons donc voir que cette fois le type_desc est NON CLUSTÉRÉ .

Notez que lors de la création d'une table, CLUSTERED peut être spécifié pour une seule contrainte. S'il est spécifié pour un UNIQUE contrainte et une PRIMARY KEY contrainte est également spécifiée, la PRIMARY KEY par défaut à NONCLUSTERED .

Exemple 5 - Créer une clé primaire sur une colonne Nullable

Une clé primaire ne peut être créée que pour les colonnes définies comme NOT NULL . Si vous essayez de créer une clé primaire sur une colonne définie sur NULL , vous obtiendrez une erreur.

Cependant, si vous ne spécifiez pas la nullabilité, la colonne est définie sur NOT NULL par défaut.

Pour illustrer cela, créons une autre table, mais cette fois, nous la définirons sur NULL :

USE PK_Test;

CREATE TABLE Dogs
(
    DogId int IDENTITY (1,1) NULL PRIMARY KEY,
    DogName varchar(50)
);

Résultat :

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

Comme prévu, nous obtenons une erreur.

Supprimons NULL à partir de la définition de table et réessayez :

USE PK_Test;

CREATE TABLE Dogs
(
    DogId int IDENTITY (1,1) PRIMARY KEY,
    DogName varchar(50)
);

Résultat :

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

Cette fois, la table a été créée avec succès.

Jetons-y un coup d'œil :

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 = 'DogId';

Résultat :

+---------+----------+---------------+---------------+
| Table   | Column   | is_nullable   | is_identity   |
|---------+----------+---------------+---------------|
| Dogs    | DogId    | 0             | 1             |
+---------+----------+---------------+---------------+

Nous pouvons donc voir que ce n'est pas nullable, car le is_nullable l'indicateur est défini sur 0 .

Exemple 6 - Clé primaire sur plusieurs colonnes

Vous pouvez également créer une clé primaire sur plusieurs colonnes. Les clés primaires multicolonnes sont également appelées clés primaires composites. Pour créer une clé primaire composite, séparez simplement les colonnes par une virgule lors de la définition de la clé.

Comme ceci :

CONSTRAINT PK_Name PRIMARY KEY (Column1, Column2)

Voici un exemple de situation où une clé primaire multicolonne pourrait être utilisée :

CREATE TABLE Musician (
MusicianId int NOT NULL,
FirstName varchar(60),
LastName varchar(60),
CONSTRAINT PK_Musician PRIMARY KEY (MusicianID)
);

CREATE TABLE Band (
BandId int NOT NULL,
BandName varchar(255),
CONSTRAINT PK_Band PRIMARY KEY (BandId)
);

CREATE TABLE BandMember (
MusicianId int NOT NULL,
BandId int NOT NULL,
CONSTRAINT PK_BandMember PRIMARY KEY (MusicianID, BandId),
CONSTRAINT FK_BandMember_Band FOREIGN KEY (BandId) REFERENCES Band(BandId),
CONSTRAINT FK_BandMember_Musician FOREIGN KEY (MusicianId) REFERENCES Musician(MusicianId)
);

Dans cet exemple, le BandMember table a une clé primaire multicolonne. Dans ce cas, chaque colonne de la clé primaire est également une clé étrangère vers la clé primaire d'une autre table, mais ce n'est pas obligatoire.

Voir Comment créer une clé primaire composite dans SQL Server pour une explication plus détaillée de cet exemple.

Consultez également Comment créer une clé étrangère composite dans SQL Server pour un exemple qui va plus loin avec une clé étrangère multicolonne qui fait référence à la clé primaire composite ci-dessus.