2012-09-03 18 views
14

En muchos aspectos de SQL, hay tres formas en que puede establecer implícitamente una columna en NULL en cada inserción de fila. Estos soncolumnas MySQL con nulo predeterminado - opción estilística, ¿o no?

columnname type NULL 
columnname type DEFAULT NULL 
columnname type NULL DEFAULT NULL 

es decir, el primero establece el indicador NULL (en contraposición a NOT NULL), segundo uno sale de la bandera NULL en el valor predeterminado, y la tercera establece el indicador NULL y define el valor implícito como NULO.

He oído hablar de cómo en Microsoft SQL, la segunda variación no es exactamente la misma ya que también puede personalizar el valor predeterminado del indicador NULL para tablas o esquemas.

Pero para MySQL, no creo que exista tal característica. Además, en MySQL, las columnas con el indicador NULL, a diferencia de las columnas NOT NULL, siempre se establecen implícitamente en NULL en insert si no hay un valor explícito, incluso si se activa el modo estricto. Entonces eso deja todas estas declaraciones de columnas idénticas.

En mi secuencia de comandos MySQL, para cada columna NOT NULL, especifico un valor PREDETERMINADO para las columnas que no espero establecer en algunas inserciones en mi aplicación, para evitar cualquier problema si tuviera que activar el modo estricto. Por lo tanto, creo que sería más simétrico si tuviera que elegir la tercera variación, a pesar de que es la más detallada y explícita. ¿Son comunes las declaraciones como la tercera variación o la primera o la segunda variación se producen con mayor frecuencia en los guiones de los demás?

Estaba considerando inclinarme hacia el segundo enfoque porque ese es el alias que usa el volcado de MySQL, pero no estoy seguro de que sea una buena idea ya que también convierte literales enteros como cadenas (comillas simples) en cláusulas predeterminadas de declaraciones de columna .

Esta pregunta puede parecer más una opinión que una que tiene una solución, pero también quiero estar al tanto de posibles errores que desconozco. Puedo elegir migrar de MySQL a PostgreSQL en el futuro, y también podría utilizar algunos consejos de esos expertos, p. si PostgreSQL distingue estos casos como lo hace MS-SQL. Corrígeme si estoy equivocado si hice alguna suposición incorrecta.

+1

No estoy seguro de estar enterado, pero en MySQL puede establecer un valor predeterminado (que no es nulo) para una columna que admite valores NULL. Si no especifica un valor para esa columna al insertar, la columna tiene su valor predeterminado. También puede especificar explícitamente que se debe insertar nulo, en cuyo caso la columna es nula. Por ejemplo, puede especificar una columna como 'SMALLINT DEFAULT 3'. Luego, si inserta un valor entero no nulo explícitamente, almacena ese valor; si inserta nulo explícitamente, almacena nulo; y si no especifica un valor al insertar, almacena 3, el valor predeterminado. – Hammerite

+0

¡sí! Solo me preocupo por las columnas que tienen un valor predeterminado nulo. –

+0

Quizás esta pregunta sea más adecuada para [programmers.se]? – eggyal

Respuesta

9

Cada base de datos que he encontrado trata los valores NULL de la forma en que los describe. Cuando una columna acepta valores NULOS, entonces al no proporcionar un valor en INSERT, el valor predeterminado es NULL. Creo que esto es parte del comportamiento estándar de ANSI.

En cuanto a especificar "NULO" en sí. Esa es una cuestión de preferencia. La norma dice que una columna permite valores NULL a menos que se especifique NOT NULL (en el nivel del lenguaje de definición de datos). Por lo tanto, el NULL sí es innecesario, y tiene una cuarta opción equivalente:

columnname type 

NULL son muy arraigadas en el lenguaje SQL a través de la norma ANSI. Su tercera opción es la más explícita, pero también se ve un poco inusual.

Si está planeando ser súper consistente en todo su sistema, entonces tomaría el camino en el que se encuentra. Para cada columna en cada tabla tiene NULL o NOT NULL. Para todas las columnas que toman valores predeterminados, tenga la instrucción DEFAULT.

Sin embargo, no espere que otras personas con las que trabaje (ahora o en el futuro) sigan fácilmente este ejemplo. Muchos preferirían la cuarta opción en este caso simplemente porque requiere menos tipeo y es la forma en que se comportan todos (o casi todos) los dialectos SQL.

+0

Sí. Casi nadie escribe el 'SELECT ALL' explícito, pero usa el' implícito (y equivalente) 'SELECT'. –

+0

aunque eggyal tenía buenos puntos (y una referencia a la documentación de MySQL), su información dejó en claro que era un estándar de SQL en lugar de uno de MySQL. Como estoy seguro de que no tendré que volver a visitar esta parte específica de las definiciones de columna si tuviera que cambiar los sistemas de bases de datos, y la mayoría debería saber acerca de los modificadores implícitos, me quedaré con el alias más conciso que haya dado. ¡Gracias! –

18

como se documenta bajo Data Type Default Values:

Si la columna puede tomar NULL como un valor, la columna se define con una cláusula explícita DEFAULT NULL.

(creo que significaban implícita, no explícita ).

Por otra parte, tal como se documenta bajo CREATE TABLE Syntax:

Si no se especifica ninguno NULL ni NOT NULL, la columna se trata como si NULL había sido especificado.

Por lo tanto, en MySQL las siguientes definiciones de columna son todos idénticos:

columnname type 
columnname type NULL 
columnname type DEFAULT NULL 
columnname type NULL DEFAULT NULL 

La elección de qué a utilizar es un equilibrio entre ser explícita, y siendo concisa. Dependiendo de las circunstancias, podría usar cualquiera de los anteriores.

+2

Tenga en cuenta que hay una caja de borde con el tipo 'TIMESTAMP'. Si su columna se declara como 'stamp TIMESTAMP', y usted hace un INSERT w/o que especifica un valor para' stamp', se establecerá de forma predeterminada INSERTing con el valor de la fecha y hora UTC actual. Si declara la columna como 'stamp TIMESTAMP NULL', entonces INSERTs tendrá como valor predeterminado NULL. – user2426679