Definición de columna SQL: ¿valor predeterminado y no redundante nulo?

86

He visto muchas veces la siguiente sintaxis que define una columna en una declaración DDL de creación / modificación:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"

La pregunta es: dado que se especifica un valor predeterminado, ¿es necesario especificar también que la columna no debe aceptar NULL? En otras palabras, ¿DEFAULT no hace que NOT NULL sea redundante?

Razvan
fuente

Respuestas:

126

DEFAULTes el valor que se insertará en ausencia de un valor explícito en una declaración de inserción / actualización. Supongamos que su DDL no tenía la NOT NULLrestricción:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault"

Entonces podrías emitir estas declaraciones

-- 1. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B) VALUES (NULL, NULL);

-- 2. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT);

-- 3. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B, col) DEFAULT VALUES;

-- 4. This will insert NULL into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL);

Alternativamente, también puede usar DEFAULTen UPDATEdeclaraciones, de acuerdo con el estándar SQL-1992 :

-- 5. This will update "MyDefault" into tbl.col
UPDATE tbl SET col = DEFAULT;

-- 6. This will update NULL into tbl.col
UPDATE tbl SET col = NULL;

Tenga en cuenta que no todas las bases de datos admiten todas estas sintaxis estándar de SQL. Agregar la NOT NULLrestricción provocará un error con las declaraciones 4, 6, mientras que 1-3, 5aún sean declaraciones válidas. Entonces, para responder a su pregunta: No, no son redundantes.

Lukas Eder
fuente
Fui a su enlace (a la publicación de su blog) esperando ver una explicación (posiblemente con algunos números) del tremendo impacto en el rendimiento de las consultas, pero solo lo vi reafirmar brevemente que tiene un impacto. No te ofendas, pero el vínculo es un poco engañoso.
Seth Flowers
@SethFlowers: Gracias por el puntero, Seth. Mientras tanto, el artículo vinculado se editó. Veré si puedo vincular algo más o eliminar el vínculo. Como está ahora, tiene toda la razón, no agrega ningún valor a la respuesta aquí.
Lukas Eder
Gracias, espero no haber sonado grosero. Acabo de ver el enlace y dije "sí, definitivamente es algo que quiero leer", luego me decepcionó un poco :).
Seth Flowers
@SethFlowers: No te preocupes. Estoy completamente de acuerdo. A mi rescate: mis habilidades para escribir blogs mejoraron enormemente en los últimos años :)
Lukas Eder
19

Incluso con un valor predeterminado, siempre puede anular los datos de la columna con null.

La NOT NULLrestricción no le permitirá actualizar esa fila después de que se creó con nullvalor

Tamir
fuente
Creo que esto debería reformularse: "La restricción NOT NULL no le permitirá actualizar esa fila después de que se creó con un valor nulo" Por supuesto, las filas con columnas NOT NULL se pueden actualizar, simplemente no se pueden actualizar con nulo como valor para esa columna. Además: supongo que crear una fila significa insertar una fila. Las declaraciones INSERT tampoco pueden tener valores nulos para las columnas que se especifican con NOT NULL.
makrom
4

Mi profesor de SQL dijo que si especificas tanto un DEFAULTvalor como NOT NULLo NULL, DEFAULTsiempre debe expresarse antesNOT NULL o NULL.

Me gusta esto:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NOT NULL

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NULL

Tanguy Labrador Ruiz
fuente
5
Hola, y gracias por participar. Sin embargo, esto no aborda la pregunta en cuestión, y ambos ordenamientos son completamente efectivos. Me resulta más fácil poner el valor predeterminado al final cuando estoy escribiendo tablas manualmente porque entonces los valores NULL y NOT NULL se alinean mejor.
emragins
Bien, supongo que también tienes razón. No entiendo por qué mi curso dice explícitamente lo que escribí en mi respuesta. Sé que mi respuesta realmente no aborda la pregunta, pero descubrí que un comentario no sería muy legible.
Tanguy Labrador Ruiz
3
Existe una diferencia entre las mejores prácticas (subjetivas) y las reglas. No es mala idea tener un estilo consistente, pero en este caso particular, personalmente preferiría NOT NULL antes que DEFAULT. Independientemente, también puede escribir comentarios en lugar de respuestas, esto hubiera sido más apropiado.
makrom
Eso probablemente no responde a la pregunta. Pero eso es exactamente lo que estaba buscando. Gracias.
Sasuke Uchiha
2

Yo diría que no.

Si la columna acepta valores nulos, entonces no hay nada que le impida insertar un valor nulo en el campo. Hasta donde yo sé, el valor predeterminado solo se aplica en la creación de una nueva fila.

Sin un conjunto nulo, no puede insertar un valor nulo en el campo, ya que arrojará un error.

Piense en ello como un mecanismo a prueba de fallos para evitar nulos.

Hipopótamo oscuro
fuente
2
Dijiste "creación de una nueva regla". ¿Tenía la intención de decir "creación de una nueva fila"?
bielawski
Creo que es una respuesta más práctica a esta pregunta.
Noman_ibrahim
@bielawski Y casi 8 años después, corrijo ese error tipográfico :)
Dark Hippo
Esta debería ser la respuesta aceptada. OP pide una pregunta simple y la respuesta es simplemente "no". Sin embargo, se necesita una explicación y un ejemplo para la documentación.
Nicolas Hevia