2012-08-08 30 views
47

he visto muchas veces la siguiente sintaxis que define una columna en un comunicado crear/modificar DDL:Definición de columna SQL: valor predeterminado y no redundante nulo?

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

La pregunta es: ya que no se especifica un valor por defecto, es necesario precisar también que la columna no debería aceptar NULLs? En otras palabras, ¿DEFAULT no hace que NOT NULL sea redundante?

Respuesta

69

DEFAULT es el valor que se insertará en la ausencia de un valor explícito en una instrucción de inserción/actualización. Vamos a suponer, el DDL no tenía la NOT NULL restricción:

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

entonces se podría 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); 

Como alternativa, también se puede utilizar DEFAULT en UPDATE declaraciones, 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; 

Nota: no todas las bases de datos admiten todas estas sintaxis estándar de SQL. Agregar la restricción NOT NULL causará un error con las declaraciones 4, 6, mientras que 1-3, 5 son aún declaraciones válidas. Así que para responder a su pregunta:

No, NOT NULL y DEFAULT no son redundantes. En particular, NOT NULL can have a tremendous impact on query performance as explained in this blog post here

8

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

La restricción NOT NULL no le permitirá actualizar esa fila después de que se crea con null valor

+0

creo que esto debería ser reformulada: "La restricción NOT NULL no le permite actualizar esa fila después de que se crea con valor nulo" De las filas del curso 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 instrucciones INSERT no pueden tener valores nulos para las columnas que se especifican con NOT NULL tampoco. – makrom

0

Yo diría que no.

Si la columna acepta valores nulos, entonces no hay nada que impida que inserte un valor nulo en el campo, hasta donde tengo conocimiento, el valor predeterminado solo se aplica en la creación de una nueva regla.

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

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

1

Mi maestro SQL dice que si se especifica un valor DEFAULT y NOT NULL o NULL, DEFAULT debe expresar siempre antes NOT NULL o NULL.

De esta manera:

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

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

+1

Hola, y gracias por participar. Sin embargo, esto no aborda la cuestión que nos ocupa, y ambos ordenamientos son completamente efectivos. Me resulta más fácil poner por defecto al final cuando estoy scripting tablas manualmente porque entonces los valores NULL y NOT NULL se alinean mejor. – emragins

+0

Bien, supongo que tienes razón tambié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 encontré que un comentario no sería muy legible. –

+0

Hay una diferencia entre las mejores prácticas (subjetivas) y las reglas. No es una mala idea tener un estilo consistente, pero en este caso particular, personalmente preferiría NOT NULL antes de DEFAULT. Independientemente, también puede escribir comentarios en lugar de respuestas, esto hubiera sido más apropiado. – makrom

Cuestiones relacionadas