web-dev-qa-db-fra.com

Limiter 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 Fréquence (varchar) qui accepte uniquement les valeurs possibles: "Quotidien", "Hebdomadaire", "Mensuel", "Annuel"

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

87
Adam

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'))
)
119
Ashish Gupta

Vous voulez un contrainte de vérification .

Les contraintes CHECK déterminent les valeurs valides à partir d'une expression logique qui ne repose pas sur des données d'une autre colonne. Par exemple, la plage de valeurs d'une colonne de salaire peut être limitée en créant une contrainte CHECK permettant uniquement des données comprises entre 15 000 et 100 000 USD. Cela évite que les salaires ne soient entrés au-delà de la plage de salaire 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 des contraintes de vérification avec des fonctions scalaires, comme décrit dans le lien ci-dessus. C'est ce que je préfère faire.

47
Michael Petrotta

Personnellement, je le coderais comme tinyint et:

  • Soit: changez-le en texte sur le client, vérifiez la contrainte entre 1 et 4
  • Ou: utilisez une table de recherche avec une clé étrangère

Les raisons:

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

  • Qu'en est-il de la collation? Est-ce que "Daily" est la même chose que "DAILY"? Il faut des ressources pour faire ce genre de comparaison.

  • Enfin, si vous voulez ajouter "toutes les deux semaines" ou "toutes les heures"? Cela nécessite un changement de schéma lorsque vous pouvez simplement ajouter de nouvelles lignes à une table de recherche.

11
gbn

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

4
Denis K