¿SQL Server equivalente al tipo de datos de enumeración MySQL?

Respuestas:

155

No lo hace. Hay un vago equivalente:

mycol VARCHAR(10) NOT NULL CHECK (mycol IN('Useful', 'Useless', 'Unknown'))
caos
fuente
10
¿Por qué no usar una tabla que defina valores válidos y luego usar una restricción de clave externa en su lugar?
Elaskanator
@Elaskanator Diría que esto responde con la mayor precisión al OP directo, mientras que la mejor solución es probablemente el uso de la tabla externa FK +.
userfuser
Gracias @Elaskanator por recordarme lo obvio ... normalizar los datos y dejar de existir la enumeración.
Andrew
88

La mejor solución que he encontrado en esto es crear una tabla de búsqueda con los valores posibles como clave principal y crear una clave externa para la tabla de búsqueda.

usuario1431422
fuente
13
Una mejor solución desde una perspectiva de mantenimiento que la restricción de verificación que se muestra arriba.
HLGEM
21
Esta es una mejor solución que Enums, también en MySQL.
ypercubeᵀᴹ
2
@ypercube ¿Por qué también es mejor para MySQL?
BenR
44
@BenRecord Hay varios problemas con las enumeraciones de MySQL: 8 razones por las cuales el tipo de datos ENUM de MySQL es malo . No estoy 100% de acuerdo con que sea malo, pero debes tener mucho cuidado al usarlos.
ypercubeᵀᴹ
1
@BenR también si recuerdo correctamente, en modo no estricto con MySQL, se puede insertar una enumeración no válida como NULL. Cualquiera sea la condición, un equipo mío anterior tuvo problemas con una enumeración MySQL que no se insertó y no falló cuando el valor no se especificó en la lista de valores. Una restricción de clave externa en una tabla de búsqueda podría causar un error. Estoy de acuerdo en que la tabla de búsqueda es mejor para MySQL.
Jim Schubert
2
CREATE FUNCTION ActionState_Preassigned()
RETURNS tinyint
AS
BEGIN
    RETURN 0
END

GO

CREATE FUNCTION ActionState_Unassigned()
RETURNS tinyint
AS
BEGIN
    RETURN 1
END

-- etc...

Donde el rendimiento es importante, aún use los valores difíciles.

Dimitrios Staikos
fuente
1

Encontré este enfoque interesante cuando quería implementar enumeraciones en SQL Server.

El enfoque mencionado a continuación en el enlace es bastante convincente, teniendo en cuenta que todas las necesidades de enumeración de su base de datos podrían satisfacerse con 2 tablas centrales.

http://blog.sqlauthority.com/2010/03/22/sql-server-enumerations-in-relational-database-best-practice/

usuario_v
fuente
8
Esta es una variación del antipatrón conocido como "una tabla verdadera (de búsqueda)". El enfoque adecuado es tener una tabla separada para cada tipo de enumeración y usar claves foráneas (si necesita alguna búsqueda, lo que puede no ser el caso para enumeraciones "puras").
Branko Dimitrijevic
2
Los comentarios en la página vinculada proporcionan una buena copia de seguridad para usar tablas individuales para cada "enumeración", en lugar de lo que especifica esta respuesta
skia.heliou
44
Es bastante divertido cómo la mayoría de la gente se opondría a este diseño, pero el autor nombra su artículo "Best Practice".
underscore_d