datos - restricciones check sql server ejemplos
DefiniciĆ³n de Columna SQL: valor predeterminado y no redundante nulo? (4)
Incluso con un valor predeterminado, siempre puede anular los datos de la columna con null
.
La restricción NOT NULL
no le permitirá actualizar esa fila después de haber sido creada con valor null
He visto muchas veces la siguiente sintaxis que define una columna en una declaración DDL crear / alterar:
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 valores NULL? En otras palabras, ¿DEFAULT no hace que NOT NULL sea redundante?
Mi profesor de SQL dijo que si especificas un valor DEFAULT
y NOT NULL
o NULL
, DEFAULT
siempre se debe expresar antes de NOT 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
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 regla.
Con un conjunto no nulo, no puede insertar un valor nulo en el campo, ya que generará un error.
Piense en ello como un mecanismo a prueba de fallas para evitar nulos.
DEFAULT
es el valor que se insertará en ausencia de un valor explícito en una instrucción de inserción / actualización. Supongamos, su DDL no tiene la restricción NOT NULL
:
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 DEFAULT
en las sentencias UPDATE
, 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 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. Entonces para responder a tu pregunta:
No, NOT NULL
y DEFAULT
no son redundantes. En particular, NOT NULL
puede tener un tremendo impacto en el rendimiento de las consultas, como se explica en este blog aquí.