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

Clé unique vs index unique sur SQL Server 2008

Une contrainte d'unicité est implémentée dans les coulisses sous la forme d'un index unique, la manière dont vous la spécifiez n'a donc pas vraiment d'importance. 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 réside dans l'intention - si vous créez la contrainte pour appliquer l'unicité/les règles métier, vous créez une contrainte, si vous le faites pour améliorer 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 empruntez pour y arriver peut aider à documenter votre intention.

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