Est-il recommandé d'utiliser Identity comme alternative à la clé primaire?

11

Nous pouvons déclarer un Identitysemblable id_numafin d' id_numavoir un incrément de nombres uniques.

CREATE TABLE new_employees
(
  id_num int IDENTITY(1,1),
  fname varchar (20),
  minit char(1),
  lname varchar(30)
)

Est-il recommandé d'utiliser Identitycomme alternative à Primary keydepuis Identityfourni un numéro unique pour chaque ligne?

Jack
la source
Pourquoi faut-il faire ça? car il est bon d'être une clé primaire dans la table, cela crée automatiquement un index de cluster et bon pour l'optimisation.
KuldipMCA
4
Non, il est recommandé de l'utiliser IDENTITY comme clé primaire (et non comme alternative à un PK). Cela donne une très bonne clé primaire très efficace (qui est par défaut également la clé de clustering dans SQL Server) - elle est étroite, elle est généralement statique, elle est généralement unique (à moins que vous ne manipuliez la spécification d'identité), et c'est toujours- croissant
marc_s

Réponses:

23

Identity columnset Primary Keyssont deux choses très distinctes. An Identity columnfournit un nombre à incrémentation automatique. C'est tout. La Primary Key(au moins dans SQL Server) est une contrainte unique qui garantit l'unicité et est généralement (mais pas toujours) la clé en cluster. Encore une fois dans MS SQL Server, il s'agit également d'un index (dans certains SGBDR, ils ne sont pas aussi étroitement liés). En tant qu'index, il fournit des recherches plus rapides, etc. Ils Identity columnssont fréquemment utilisés comme Primary Keys'il n'y a pas de bien natural key, mais ne sont pas un substitut.

Kenneth Fisher
la source
1
Dans SQL Server, un index non clusterisé contient la clé primaire au niveau feuille. La désignation d'une clé naturelle comme clé primaire rendra vos index très volumineux.
Andomar
2
@Andomar a PK est une entité logique. L'index de prise en charge du PK est physique. Et un index non clusterisé peut prendre en charge un PK, ne doit pas nécessairement être un index clusterisé. Par conséquent, votre déclaration est incorrecte si l'index du PK est un NCI. Il s'agit de la clé d'index cluster au niveau feuille des NCI.
Thomas Stringer
@ThomasStringer: Vous avez raison, mon commentaire devrait lire clustered index keyoù il est dit primary key.
Andomar
Peut-être. Votre clé naturelle peut être un entier, auquel cas il n'y a pas de différence. Le nombre d'arguments que vous verrez sur les clés artificielles vs naturelles est stupéfiant. Essayez une recherche sur le Web à un moment donné :) Cela s'avère justement être l'un des arguments pour les clés artificielles.
Kenneth Fisher
5

Non, ce n'est pas le cas, car l'identité ne garantit pas une valeur unique. La propriété d'identité peut être contournée avec SET IDENTITY_INSERT <schema>.<table> ON(dans SQL Server - vous n'avez pas spécifié le SGBDR que vous utilisez).

Une contrainte de clé primaire (et une contrainte unique) utilise un index unique pour appliquer l' unicité.

Marcheur de Greenstone
la source
5
il ne garantit pas une valeur unique. Mais rien d'autre. Toute personne ayant accès à la base de données peut tenter d'insérer des valeurs en double dans une clé primaire. Ce que fait une identité, c'est de générer plus facilement des valeurs uniques (surtout si vous n'avez pas une bonne clé naturelle comme le dit Kenneth Fisher). Vous pourriez déclarer un champ entier avec une clé primaire et ce serait exactement la même chose mais sans génération automatique. L'IDENTITÉ est donc pour la génération et la clé est pour imposer l' unicité.
Chris Aldrich
+1 Pour avoir souligné la faille de base dans la prémisse de la question - Identityet Primary Keyne sont pas équivalents et servent deux objectifs distincts.
JNK