w3school - Clé unique ou index unique sur SQL Server 2008




w3school index sql (3)

Autre que les excellentes réponses ci-dessus, j'ajouterais mes 2 cents ici.

La clé unique est une contrainte et utilise un index unique pour s'imposer. Tout comme la clé primaire est généralement appliquée par un index unique en cluster. Logiquement parlant, une contrainte et un index sont deux choses différentes. Mais dans le SGBDR, une contrainte peut être implémentée physiquement via un index.

Si une table est créée avec une contrainte unique dans le serveur sql, vous verrez à la fois un objet de contrainte et un index unique

create table dbo.t (id  int constraint my_unique_constraint unique (id));

select [Constraint]=name from sys.key_constraints 
where parent_object_id = object_id('dbo.t');

select name, index_id, type_desc from sys.indexes
where object_id = object_id('dbo.t')
and index_id > 0;

nous obtiendrons ce qui suit (une contrainte et un index)

Cependant, si nous ne créons pas de contrainte mais juste un index unique comme suit

create table dbo.t2 (id int );
create unique index my_unique_constraint on dbo.t2 (id);

select [Constraint]=name from sys.key_constraints 
where parent_object_id = object_id('dbo.t2');

select name, index_id, type_desc from sys.indexes
where object_id = object_id('dbo.t2')
and index_id > 0

Vous verrez qu'il n'y a pas d'objet de contrainte créé (seul un index est créé).

Du point de vue «théorique», dans SQL Server, une contrainte est un objet avec la valeur object_id et est liée au schéma, tandis qu'un index n'est pas un objet et n'a pas de valeur object_id et aucun lien de schéma.

https://code.i-harness.com

J'ai une table appelée countries et je définis la colonne country_name comme unique en créant un "Index / Key" de type "Unique Key" sur SQL Server 2008 R2.

Mais j'ai les questions suivantes:

  1. va créer "Index / Key" de type "Unique Key" créer automatiquement un index non-clustered sur cette colonne?
  2. si je change le type d'être "Unique Key" à "Index" et je garde la valeur IsUnique à "Oui", alors y aura-t-il des différences?
  3. alors pourquoi il y a deux options "Unique Key" et "Index" Je pense que les deux sont les mêmes?

Si vous utilisez SqlMetal.exe pour générer des entités DBML ou LinqToSql:

  • Si une clé étrangère utilise une clé unique, vous obtiendrez une association comme prévu.
  • Si une clé étrangère utilise un index unique, elle n'apparaîtra pas.

La raison en est dans la mise en œuvre de SqlMetal. Il interroge le schéma d'informations de la base de données, en particulier l'utilisation des colonnes clés. Les clés uniques sont représentées ici, mais les index uniques ne le sont pas.

SELECT TABLE_NAME, CONSTRAINT_NAME, COLUMN_NAME, ORDINAL_POSITION
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE;

Une contrainte unique est implémentée dans les coulisses sous la forme d'un index unique, peu importe comment vous l'indiquez. J'ai tendance à l'implémenter simplement comme:

ALTER TABLE dbo.foo ADD CONSTRAINT UQ_bar UNIQUE(bar);

Certaines personnes créent un index unique à la place, par exemple

CREATE UNIQUE INDEX IX_UQ_Bar ON dbo.foo(bar);

La différence est dans l'intention - si vous créez la contrainte pour appliquer les règles d'unicité / métier, vous créez une contrainte, si vous le faites pour assister les performances des requêtes, il peut être plus logique de créer un index unique. Encore une fois, sous les couvertures, c'est la même mise en œuvre, mais le chemin que vous emprunterez pour arriver là-bas pourrait vous aider à documenter votre intention.

Je pense qu'il existe plusieurs options pour adhérer à la fois aux fonctionnalités Sybase précédentes et adhérer à la norme ANSI (même si les contraintes uniques ne respectent pas la norme 100%, puisqu'elles n'autorisent qu'une seule valeur NULL - un index unique, sur d'autre part, peut contourner ce problème en ajoutant une clause WHERE col IS NOT NULL ( WHERE col IS NOT NULL ) sur SQL Server 2008 et supérieur).





sql-server-2008-r2