2008-11-04 11 views
25

Estoy trabajando en un proyecto y quiero almacenar información fácilmente enumerada en una tabla. El tipo de datos enum de MySql hace exactamente lo que yo quiero: http://dev.mysql.com/doc/refman/5.0/en/enum.html. ¿Hay un equivalente en SQL Server 2005?¿SQL Server 2005 tiene un equivalente al tipo de datos ENUM de MySql?

Sé que podría almacenar los valores posibles en una tabla de tipos con una clave, pero prefiero no tener que volver a enlazar para obtener descripciones. Nuestros estándares de base de datos no nos permiten vincularnos en campos no enteros o de identificador único, por lo que también se almacena el almacenamiento de las posibles claves como caracteres.

Respuesta

23

¿Esto funciona para usted?

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

Crear una tabla ...

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

Eso funciona para mí. Hay una preocupación restante: ¿hay una forma fácil de decir qué valores válidos son para la enumeración sin seleccionar la restricción? Entiendo que no es así y tendré que tomar una decisión basada en eso. –

+0

No estoy seguro de lo que quiere decir con "seleccionar" la restricción, pero es posible que pueda envolver los resultados de esta consulta del sistema en algo utilizable para sus necesidades. Seleccione la definición de sys.check_constraints donde [name] = 'yourConstraintName' – Nikki9696

+0

Para las restricciones ENUM y CHECK, puede consultar tablas del sistema y obtendrá una cadena con la sintaxis completa que especifica la lista de valores. Luego tiene que analizar eso para obtener la lista en un formato utilizable. Es bastante incómodo consultar los metadatos como si se tratara de datos. –

17

Una charact El tipo de datos ENUM erístico de MySQL es que almacena solo un índice numérico en la lista de valores, no la cadena en sí, en cada fila. Por lo general, es más eficiente en almacenamiento. También el comportamiento predeterminado cuando se ordena por una columna ENUM es ordenar por el índice numérico, por lo tanto, por el orden de los elementos en el ENUM.

Nikki9696 sugiere utilizar una columna VARCHAR con una restricción CHECK. Esto satisface la restricción de valores a una cierta lista corta de valores permitidos, pero no simula la eficiencia de almacenamiento o el orden de clasificación especial.

Una forma de obtener ambos comportamientos es declarar la columna como una clave externa entera en una tabla de búsqueda, en la que almacena cada cadena permitida.

+3

Una opción aún mejor que la que publiqué, estoy de acuerdo. – Nikki9696

+0

Gran alternativa. Gracias. – Sung

+0

Estoy confundido. ¿No es esto exactamente lo que el autor de la pregunta dice que no quiere hacer (en el último párrafo)? –

Cuestiones relacionadas