2008-11-04 6 views
25

Je travaille sur un projet et je veux stocker des informations facilement énumérées dans une table. Le type de données enum de MySql fait exactement ce que je veux: http://dev.mysql.com/doc/refman/5.0/en/enum.html. Existe-t-il un équivalent dans SQL Server 2005?Est-ce que SQL Server 2005 a un équivalent au type de données ENUM de MySql?

Je sais que je pouvais stocker les valeurs possibles dans un tableau de type avec une clé, mais je préfère ne pas avoir de lien vers elle pour obtenir une description. Nos standards de base de données ne nous permettent pas de créer un lien sur des champs non-entiers ou uniquesidentifier, ainsi le stockage des clés possibles en tant que caractères est également disponible.

Répondre

23

Est-ce que cela fonctionne pour vous?

De http://blechie.com/wtilton/archive/2007/08/24/303.aspx

Créer la table ...

MySQL:

ColumnName ENUM('upload', 'open', 'close', 'delete', 'edit', 'add') 
    DEFAULT 'open' 

SQL Server:

ColumnName varchar(10) 
    CHECK(ColumnName IN ('upload', 'open', 'close', 'delete', 'edit', 'add')) 
    DEFAULT 'open' 
+0

Cela fonctionne pour moi. Il reste une préoccupation: existe-t-il un moyen facile de dire quelles sont les valeurs valables pour l'énumération sans sélectionner la contrainte? Je comprends qu'il n'y en a pas et je vais devoir prendre ma décision en fonction de cela. –

+0

Je ne suis pas sûr de ce que vous entendez par "sélection" de la contrainte, mais vous pourriez être en mesure d'intégrer les résultats de cette requête système dans quelque chose d'utilisable pour vos besoins. définition select de sys.check_constraints où [nom] = « yourConstraintName » – Nikki9696

+0

Pour les deux ENUM et contrôleront les contraintes, vous pouvez interroger les tables système et vous obtenez une chaîne avec la syntaxe complète spécifiant la liste des valeurs. Ensuite, vous devez analyser cela pour obtenir la liste dans un format utilisable. Il est assez incommode d'interroger les métadonnées comme s'il s'agissait de données. –

17

Un charact Eristic du type de données ENUM de MySQL est qu'il stocke seulement un index numérique dans la liste des valeurs, pas la chaîne elle-même, sur chaque ligne. C'est donc généralement plus efficace en termes de stockage. De même, le comportement par défaut lors du tri par colonne ENUM consiste à trier par l'index numérique, donc par l'ordre des éléments dans l'ENUM.

Nikki9696 suggère d'utiliser une colonne VARCHAR avec une contrainte CHECK. Cela satisfait la restriction des valeurs à une certaine liste restreinte de valeurs autorisées, mais elle ne simule pas l'efficacité du stockage ou l'ordre de tri spécial.

Une façon d'obtenir les deux comportements est de déclarer la colonne comme un entier clé étrangère dans une table de consultation, dans laquelle vous stockez chaque chaîne autorisée.

+3

Une option encore meilleure que ce que j'ai posté, je suis d'accord. – Nikki9696

+0

Grande alternative. Je vous remercie. – Sung

+0

Je suis confus. N'est-ce pas exactement ce que l'auteur de la question déclare qu'il ne veut pas faire (dans le dernier paragraphe)? –

Questions connexes