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
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