web-dev-qa-db-fra.com

Quelle est la différence entre une clé primaire et une contrainte unique?

Quelqu'un m'a posé cette question lors d'une interview ...

35
Tim

Une clé primaire est un champ unique dans une table, mais il est spécial en ce sens que la table considère cette ligne comme sa clé. Cela signifie que d'autres tables peuvent utiliser ce champ pour créer des relations de clé étrangère entre elles.

Une contrainte unique signifie simplement qu'un champ particulier doit être unique.

23
Andrew Hare

Les clés primaires ne peuvent pas être nulles. Des clés uniques peuvent.

51
Håvard
  1. La clé primaire ne peut pas être nulle mais unique ne peut avoir qu'une seule valeur nulle.
  2. La clé primaire crée automatiquement l'index de cluster, mais pas la clé unique.
  3. Une table ne peut avoir qu'une seule clé primaire mais plusieurs clés uniques.
12
Giriraj Govil

TL; DR Beaucoup peut être impliqué par PRIMARY KEY (unicité, référence, non-null-ness, clustering, etc.) mais rien qui ne puisse être déclaré explicitement en utilisant UNIQUE.

Je suggère que si vous êtes le genre de codeur qui aime la commodité de SELECT * FROM... sans avoir à répertorier toutes ces colonnes embêtantes, alors PRIMARY KEY est fait pour vous.


une relvar peut avoir plusieurs clés, mais nous en choisissons une pour souligner et appeler celui-là la clé primaire. Le choix est arbitraire, donc le le concept de primaire n’est pas vraiment très important d’un point de vue logique de vue. Le concept général de clé est cependant très important! Le terme clé de candidat signifie exactement la même chose que la clé (c'est-à-dire que l'ajout du candidat n'a pas de signification réelle - cela a été proposé par Ted Codd parce qu'il considérait chaque clé comme un candidat à la nomination. clé) ... SQL permet à un sous-ensemble des colonnes d'une table d'être déclaré comme une clé pour cette table. Cela permet également à l'un d'entre eux d'être nommé comme clé primaire. Spécifier une clé comme étant primaire rend pour un certain confort en relation avec autre contraintes qui pourraient être nécessaires

Qu'est-ce qu'une clé? par Hugh Darwen


il est habituel ... de choisir une clé comme clé primaire (et toute autre clé pour la relvar en question est alors dite clé alternative) . Mais si une clé doit être choisie comme clé principale et, le cas échéant, laquelle, sont essentiellement des problèmes psychologiques, au-delà de la compétence du modèle relationnel en tant que tel. Par souci de bonne pratique, la plupart des base les relvars devraient probablement avoir une clé primaire - mais, pour répéter cette règle, si c'est une règle, ce n'est pas vraiment un problème relationnel en tant que tel ... Fort recommandation [aux utilisateurs de SQL]: Pour les tables de base, utilisez dans tous les cas PRIMARY KEY et/ou UNIQUE spécifications pour s’assurer que chacune d’entre elles table a au moins une clé.

SQL et théorie relationnelle: comment écrire un code SQL précis De C. J. Date

En SQL standard PRIMARY KEY

  • implique l'unicité mais vous pouvez le spécifier explicitement (en utilisant UNIQUE).
  • implique NOT NULL mais vous pouvez le spécifier explicitement lors de la création de colonnes (mais vous devriez éviter les nulls de toute façon!)
  • vous permet d'omettre ses colonnes dans un FOREIGN KEY mais vous pouvez les spécifier explicitement.
  • peut être déclarée pour une seule clé par table mais on ne voit pas pourquoi (Codd, qui avait initialement proposé le concept, n’a pas imposé une telle restriction).

Dans certains produits, PRIMARY KEY implique l'index clusterisé de la table, mais vous pouvez le spécifier explicitement (vous ne souhaitez peut-être pas que la clé primaire soit l'index clusterisé!)

Pour certaines personnes, PRIMARY KEY a une signification purement psychologique:

  • ils pensent que cela signifie que la clé sera référencée dans une clé étrangère (ceci a été proposé par Codd mais n'a pas été réellement adopté par les fournisseurs SQL standard ni par les fournisseurs SQL).
  • ils pensent que cela signifie la seule clé de la table (mais l'impossibilité d'appliquer d'autres clés candidates entraîne une perte de l'intégrité des données).
  • ils pensent que cela implique une clé «de substitution» ou «artificielle» sans importance pour l'entreprise (mais impose en réalité une signification indésirable à l'entreprise en exposant celle-ci aux utilisateurs).
5
onedaywhen

Unique Key contraintes:

  1. La contrainte de clé unique vous fournira une contrainte telle que les valeurs de colonne doivent conserver l'unicité.
  2. Il créera un index non clusterisé par défaut 
  3. N'importe quel nombre de contraintes uniques peut être ajouté à une table.
  4. Cela autorisera une valeur nulle dans la colonne.

    ALTER TABLE nom_table ADD CONSTRAINT UNIQUE_CONSTRAINT UNIQUE (nom_colonne1, nom_colonne2, ...)

Clé primaire:

  1. La clé primaire créera l'unicité des données de colonne dans la table.
  2. La clé primaire créera un index clusterisé par défaut
  3. Une seule clé Primay peut être créée pour une table
  4. Plusieurs colonnes peuvent être consolidées pour former une seule clé primaire
  5. Il n'autorisera pas les valeurs nulles.

    ALTER TABLE nom_table ADD CONSTRAINT KEY_CONSTRAINT PRIMARY KEY (nom_colonne)

4
prnawa

Chaque clé primaire est une contrainte unique, mais une table peut comporter, outre la clé PK, des contraintes uniques supplémentaires.

Supposons que vous avez une table Employees, PK EmployeeID. Vous pouvez ajouter une contrainte unique sur SSN, par exemple.

4
Beth

En plus de la réponse d'Andrew, vous ne pouvez avoir qu'une clé primaire par table, mais vous pouvez avoir de nombreuses contraintes uniques.

2
klabranche
  1. L'objectif de la clé primaire est d'identifier de manière unique une ligne dans une table. La contrainte unique garantit que la valeur d'un champ est unique parmi les lignes de la table.
  2. Vous ne pouvez avoir qu'une seule clé primaire par table. Vous pouvez avoir plus d'une contrainte unique par table.
2
Cătălin Pitiș

Une clé primaire est un ensemble minimal de colonnes tel que deux enregistrements quelconques ayant des valeurs identiques dans ces colonnes ont des valeurs identiques dans toutes les colonnes. Notez qu'une clé primaire peut être composée de plusieurs colonnes.

Cela ressemble exactement à une contrainte d'unicité.

1
Thom Smith

La contrainte UNIQUE identifie de manière unique chaque enregistrement d'une table de base de données.

Les contraintes UNIQUE et PRIMARY KEY fournissent toutes les deux une garantie d'unicité pour une colonne ou un ensemble de colonnes.

Une contrainte PRIMARY KEY est automatiquement définie par une contrainte UNIQUE.

Notez que vous pouvez avoir plusieurs contraintes UNIQUE par table, mais une seule contrainte PRIMARY KEY par table.

1
Manjeet Barnala

Les clés primaires sont essentiellement une combinaison de (unique + non nul). De plus, lors de la référence à une clé étrangère, rdbms nécessite une clé primaire.

Une clé unique impose simplement l'unicité de la colonne. Une valeur de champ peut être NULL dans le cas d'une clé unique. De plus, il ne peut pas être utilisé pour référencer une clé étrangère, ce qui est assez évident car u peut contenir des valeurs NULL.

0
Kazoom

Il y a plusieurs bonnes réponses ici jusqu'à présent. Outre le fait qu'une clé primaire ne peut pas être null, constitue une contrainte unique et peut être composée de plusieurs colonnes, il existe des significations plus profondes qui dépendent du serveur de base de données que vous utilisez.

Je suis un utilisateur de SQL Server, donc une clé primaire a une signification plus spécifique pour moi. Dans SQL Server, par défaut, les clés primaires font également partie de ce qu'on appelle "l'index clusterisé". Un index clusterisé définit l'ordre réel des pages de données pour cette table particulière, ce qui signifie que l'ordre de la clé primaire correspond à l'ordre physique des lignes sur le disque.

Je sais que l'un des formats de table de MySql, éventuellement plusieurs, prend également en charge l'indexation en cluster, ce qui signifie la même chose que dans SQL Server ... elle définit le classement physique des lignes sur le disque.

Oracle fournit quelque chose appelé Index Organized Tables (Tableaux organisés par index), qui classe les lignes sur le disque en fonction de la clé primaire.

Je ne connais pas très bien DB2, mais je pense qu’un index clusterisé signifie que les lignes du disque sont stockées dans le même ordre qu’un index séparé. Je ne sais pas si l'index clusterisé doit correspondre à la clé primaire ou s'il peut s'agir d'un index distinct.

0
jrista

Un grand nombre de réponses ici ont discuté des propriétés de PK par rapport à des contraintes uniques. Mais il est plus important de comprendre la différence de concept.

Une clé primaire est considérée comme un identifiant de l'enregistrement dans la base de données. Celles-ci seront par exemple référencées lors de la création de références de clé étrangère entre tables. Dans des circonstances normales, une clé primaire ne doit donc jamais contenir de valeurs ayant une importance quelconque dans votre domaine (des champs incrémentiels sont automatiquement utilisés pour cela).

Une contrainte unique est simplement un moyen d'appliquer des règles métier spécifiques à un domaine dans votre schéma de base de données.

Parce que la clé est un identifiant pour l'enregistrement, vous ne pouvez jamais changer la valeur d'une clé primaire. 

0
Pete
create table a1 (id int,name varchar(20),city varchar(20),state varchar(20),country varchar(28) constraint pk_a1 primary key(id));
insert into a1 values(101,'sohan','gkp','up','india');


create table a1 (id int primary key,name varchar(20),city varchar(20),state varchar(20),country varchar(28));
insert into a1 values(101,'sohan','gkp','up','india');

quelle est la différence entre ces deux tables utilisant une clé primaire et des contraintes

0
sohan yadav

Les deux garantissent l'unicité des lignes du tableau, à l'exception des valeurs nulles, comme indiqué dans certaines des autres réponses.

De plus, une clé primaire "vient" avec un index, qui peut être en cluster ou non.

0
alienonland

La clé primaire ne peut pas être nulle mais la contrainte unique est nulle .. .. lorsque vous choisissez une clé primaire pour votre table, il indexe automatiquement ce champ. 

0
Am1rr3zA