91 votes

Restreindre la colonne varchar() à des valeurs spécifiques ?

Existe-t-il un moyen de spécifier, par exemple, 4 valeurs distinctes pour une colonne varchar dans MS SQL Server 2008 ?

Par exemple, j'ai besoin d'une colonne appelée Frequency (varchar) qui n'accepte que les valeurs "Daily", "Weekly", "Monthly" et "Yearly" comme valeurs possibles.

Est-il possible de définir ce paramètre dans le SQL Server Management Studio lors de la création de la table ?

124voto

Ashish Gupta Points 5229

Avez-vous déjà envisagé d'ajouter un check constraint sur cette colonne qui restreindrait les valeurs ? Quelque chose comme :

CREATE TABLE SomeTable
(
   Id int NOT NULL,
   Frequency varchar(200),
   CONSTRAINT chk_Frequency CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))
)

54voto

Michael Petrotta Points 35647

Vous voulez un vérifier la contrainte .

Les contraintes CHECK déterminent les valeurs valides à partir d'une expression logique qui n'est pas basée sur les données d'une autre colonne. Pour exemple, la plage de valeurs d'une colonne colonne de salaire peut être limitée en créant une contrainte CHECK qui qui autorise uniquement les données comprises entre 15 000 $ à 100 000 $. Ce site empêche la saisie de salaires au-delà de la fourchette de salaires normale.

Vous voulez quelque chose comme :

ALTER TABLE dbo.Table ADD CONSTRAINT CK_Table_Frequency
    CHECK (Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly'))

Vous pouvez également implémenter les contraintes de contrôle avec des fonctions scalaires, comme décrit dans le lien ci-dessus, ce qui est la façon dont je préfère le faire.

11voto

gbn Points 197263

Personnellement, je le coderais comme tinyint et :

  • Soit : le changer en texte sur le client, vérifier la contrainte entre 1 et 4
  • Ou : utiliser une table de consultation avec une clé étrangère.

Raisons :

  • Il faudra en moyenne 8 octets pour stocker du texte, 1 octet pour un tinyint. Sur des millions de lignes, cela fera une différence.

  • Qu'en est-il de la collation ? Est-ce que "Daily" est identique à "DAILY" ? Il faut des ressources pour effectuer ce genre de comparaison.

  • Enfin, que se passe-t-il si vous voulez ajouter "Bihebdomadaire" ou "Horaire" ? Cela nécessite une modification du schéma alors qu'il suffirait d'ajouter de nouvelles lignes à une table de consultation.

5voto

Denis K Points 873

Lorsque vous modifiez un tableau
Clic droit -> Vérifier les contraintes -> Ajouter -> Tapez quelque chose comme Frequency IN ('Daily', 'Weekly', 'Monthly', 'Yearly') dans le champ expression et un bon nom de contrainte dans le champ (Nom).
Vous avez terminé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X