web-dev-qa-db-fra.com

Comment créer une contrainte unique sur ma colonne (SQL Server 2008 R2)?

J'ai SQL Server 2008 R2 et je veux définir une colonne unique.

Il semble y avoir deux façons de procéder: "index unique" et "contrainte unique". Ils ne diffèrent pas beaucoup de ce que je comprends, bien que la plupart des personnes recommandent une contrainte unique, car vous obtenez également un index automatiquement.

Comment créer une contrainte unique?

ALTER TABLE Customer ADD CONSTRAINT U_Name UNIQUE(Name)

Est-il possible de créer une contrainte unique via SQL Server Management Studio?

90
White Island

Pour créer ces contraintes à l'aide de l'interface graphique, vous avez besoin du dialogue "Index et clés" et non de celui des contraintes de vérification.

Mais dans votre cas, vous devez simplement exécuter le morceau de code que vous avez déjà. Il n'est pas du tout nécessaire d'entrer dans le dialogue d'expression.

50
Martin Smith

Définissez la colonne comme unique dans SQL Server à partir de l'interface graphique:

Ils vous font vraiment courir autour de la grange pour le faire avec l'interface graphique:

Assurez-vous que votre colonne ne viole pas la contrainte unique avant de commencer.

  1. Ouvrez SQL Server Management Studio.
  2. Faites un clic droit sur votre table, cliquez sur "Design".
  3. Cliquez avec le bouton droit de la souris sur la colonne à modifier, un menu contextuel apparaît, cliquez sur Index/Clés.
  4. Cliquez sur le bouton "Ajouter".
  5. Développez l'onglet "Général".
  6. Assurez-vous que la colonne que vous souhaitez rendre unique est sélectionnée dans la zone "Colonnes".
  7. Changez la case "Type" en "Clé unique".
  8. Cliquez sur "Fermer".
  9. Vous voyez un petit astérisque dans la fenêtre du fichier, cela signifie que les modifications ne sont pas encore enregistrées.
  10. Appuyez sur Enregistrer ou appuyez sur Ctrl + s. Cela devrait économiser et votre colonne devrait être unique.

Ou définissez la colonne comme unique à partir de la fenêtre de requête SQL:

alter table location_key drop constraint pinky;
alter table your_table add constraint pinky unique(yourcolumn);

Les modifications prennent effet immédiatement:

Command(s) completed successfully.
105
Eric Leschinski

Voici un autre moyen d’utiliser l’interface graphique qui fait exactement ce que fait votre script même s’il passe par des index (et non des contraintes) dans l’explorateur d’objets.

  1. Faites un clic droit sur "Index" et cliquez sur "Nouvel index ..." (note: ceci est désactivé si la table est ouverte en mode création)

enter image description here

  1. Nommez le nouvel index ("U_Name"), cochez la case "Unique" et cliquez sur "Ajouter ..."

enter image description here

  1. Sélectionnez la colonne "Nom" dans la fenêtre suivante

enter image description here

  1. Cliquez sur OK dans les deux fenêtres
14
Tony L.

Une chose qui n'est pas clairement couverte est que Microsoft SQL crée en arrière-plan un index unique pour la contrainte ajoutée.

create table Customer ( id int primary key identity (1,1) , name nvarchar(128) ) 

--Commands completed successfully.

sp_help Customer

---> index
--index_name    index_description   index_keys
--PK__Customer__3213E83FCC4A1DFA    clustered, unique, primary key located on PRIMARY   id

---> constraint
--constraint_type   constraint_name delete_action   update_action   status_enabled  status_for_replication  constraint_keys
--PRIMARY KEY (clustered)   PK__Customer__3213E83FCC4A1DFA  (n/a)   (n/a)   (n/a)   (n/a)   id


---- now adding the unique constraint

ALTER TABLE Customer ADD CONSTRAINT U_Name UNIQUE(Name)

-- Commands completed successfully.

sp_help Customer

---> index
---index_name   index_description   index_keys
---PK__Customer__3213E83FCC4A1DFA   clustered, unique, primary key located on PRIMARY   id
---U_Name   nonclustered, unique, unique key located on PRIMARY name

---> constraint
---constraint_type  constraint_name delete_action   update_action   status_enabled  status_for_replication  constraint_keys
---PRIMARY KEY (clustered)  PK__Customer__3213E83FCC4A1DFA  (n/a)   (n/a)   (n/a)   (n/a)   id
---UNIQUE (non-clustered)   U_Name  (n/a)   (n/a)   (n/a)   (n/a)   name

comme vous pouvez le constater, il existe une nouvelle contrainte et un nouvel index _Name

8
detzu