2011-11-17 8 views
8

Estoy tratando de entender cómo las enum podrían usarse en mysql. Si inserto algo en el campo enum que está fuera del tipo enum, mysql inserta cadena vacía (con valor 0).MySQL enumera el valor vacío

  • fruit ENUM ('APPLE', 'BANANA', 'PEACH');
  • INSERT ... fruta = 'banana'

falta de ortografía simple y MySQL inserta valor vacío, se rompe la integridad de la base de datos y hace que las enumeraciones extremadamente inútil.

restricciones CHECK podrían ayudar aquí, pero MySQL no es compatible con ellos (bastante divertido para la base de datos "más popular" en 2011)

La única manera que veo es escribir el gatillo para evitar la cadena vacía, pero es demasiado trabajo para escribir disparador para un caso tan simple.

¿Existe alguna forma de desactivar el comportamiento MySQL "cadena vacía" para las enumeraciones?

Gracias

Respuesta

4

miren modos SQL

SET SQL_MODE='TRADITIONAL'; 
8

Según el documentation:

Si inserta un valor no válido en un ENUM (es decir, una cadena no presente en la lista de valores permitidos), la cadena vacía se inserta en su lugar como un valor de error especial. Esta cadena se puede distinguir de una cadena vacía "normal" por el hecho de que esta cadena tiene el valor numérico 0.

En una nota al margen, I (and others) le recomendamos evitar enumeraciones, ya que no son muy eficientes.

Si realmente necesita enumeraciones, considere usar el modo estricto. El modo estricto arrojará al menos un error cuando intente insertar un valor no válido en una columna ENUM. De lo contrario, solo se emite una advertencia y el valor simplemente se establece en una cadena vacía '' (a la que se hace referencia internamente como 0). Nota: Los errores aún se pueden suprimir en modo estricto si usa IGNORE.

Aquí hay un enlace al documentation on setting your MySQL server mode.

Happy coding!

Actualización: La respuesta de Nick es una forma de configurar su servidor en modo estricto. El modo TRADICIONAL es equivalente a STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, por lo que debe tener en cuenta que se realizará una validación de datos adicional en otros tipos de datos, como DATE, por ejemplo.

Cuestiones relacionadas