Enum de MySql en Sql Server

Si has llegado hasta aquí probablemente o eres un seguidor del blog, o… te has encontrado con el mismo problema que yo me encontré en su momento. Tal y como se puede ver aquí los ENUM se definen como: Un ENUM es un objeto de cadenas de caracteres con un valor elegido de una lista de valores permitidos que se enumeran explícitamente en la especificación de columna en tiempo de creación de la tabla.Este concepto en SQL Server no existe como tal, pero no es dificil de imitar el mismo. 

Para ello lo necesario es crear una tabla que lleve Id y Descripcion que incluya tantos registros como elementos tendría el enum en MySql. Una vez creada la tabla de la que se consumirán los datos que formarán el conjunto de nuestro campo. En la tabla que migramos de MySql en vez de que el campo sea de tipo enum le daremos al campo el tipo de dato del id de nuestra tabla de partida. Un ejemplo de exportación de una tabla podría ser la siguiente:

MySql:

SQL Server:

Siendo EstadoOferta la nueva tabla donde tendremos los 4 registros que indicarían los 4 estados del ENUM de MySQL.

Actualización: Saqué esta entrada antes de tiempo, antes de realizar las imágenes que quería subir y un ejemplo en sql server en el que se viera lo que quería explicar. De modo que me he creado un ejemplito bastante sencillo:

Creamos la tabla que compone el enum

Creamos una tabla de empleados, que recibirá el enum:

Rellenamos los datos  que compondran el enumerado:

Rellenamos los empleados recogiendo con un tipo de empleado ya creado anteriormente

Bien, hecho esto, todo dato que esté dado de alta en la tabla TipoEmpleado que se haya usado en Empleado no se podrá eliminar, si intentamos por ejemplo la sentencia DELETE FROM TipoEmpleado WHERE IdTipoEmpleado=1 que eliminaría el tipo de empleado que se asignó al empleado numero 1, se produce una excepción que indica lo siguiente:Instrucción DELETE en conflicto con la restricción REFERENCE “FK__Empleado__IdTipo__03317E3D”. El conflicto ha aparecido en la base de datos “test”, tabla “dbo.Empleado”, column ‘IdTipoEmpleado’.

Por tanto, la identidad referencial nos asegura que ese enum no va a ser corrompido si esos Id están usados en alguna de las tablas que heredan de los mismos, de forma que queden datos huérfanos. 

Comments are closed here.