Un valor nulo es la ausencia de valor. No es una cadena vacía en un texto o un 0 en un valor numérico. Es simplemente la ausencia de cualquier valor.
Cuando definimos un campo en una tabla, es posible forzar que dicho campo acepte o rechace guardar valores nulos en él. Esto asegurará que el campo en cuestión es que rechace -o acepte- cualquier intento (en un Insert o Update) de dejar el campo con un valor nulo.
Si un campo no permite valores nulos obliga a que al hacer un Insert se proporcione un valor para dicho campo, o bien, que se le defina un valor por default. Por el contrario, si el campo acepta valores nulos, entonces al hacer el Insert no será necesario dar un valor a dicho campo y por tanto el campo tendrá el valor null.
¿Cuándo un campo debería permitir valores nulos?
No todos los campos, en una tabla, son llenados al momento del Insert inicial; esos campos que no necesitan un valor al momento de agregar el registro, o que aún no hay información disponible, son los candidatos a permitir valores nulos; por ejemplo:
- El campo de fecha de egreso, en una escuela, no se tiene al momento del primer ingreso; es un valor que se conocerá al final de su vida escolar en el colegio, ya sea porque concluye sus cursos o por que abandona los estudios.
- Otro caso de fechas, pero ahora en una tienda, sería una fecha de devolución de un producto; si un producto nunca es devuelto, entonces es un campo que nunca se deberá llenar y por tanto deberá permitir valores nulos.
- En una estructura jerárquica, donde un registro tiene la referencia al superior jerárquico, existe el caso especial de la cabeza de la estructura (que no tiene superior jerárquico porque es el puesto superior a todos) se debe permitir guardar un valor nulo, aunque solo lo ocupe un solo registro en toda la tabla.
En general, se puede decir que los campos que permitan nulos son campos que se refieren a un evento que aún no se presenta (al momento del Insert) como el egreso en una escuela o la devolución en una tienda; o bien, son campos que por si solos no deben tener un valor (por que no aplica) como el caso del superior jerárquico de la cabeza de una organización.
Valores nulos
Si bien las reglas de Codd especifican que toda base de datos relacional debe aceptar el uso de valores nulos, en la primera forma normal se desaconseja su uso, ya que vuelve más complejas las consultas que se pueden hacer de estos campos.
Cuando se define un campo en una tabla es siempre recomendable, de cualquier manera, especificar si dicho campo aceptará, o no, valores nulos. Esta especificación se hace para cada campo y se realiza colocando un «NULL» o un «NOT NULL» en la definición de dicho campo. Así, si se quiere definir un campo, en un CREATE TABLE, llamado «nombre», de tipo texto y que acepte nulos se tiene que escribir
nombre varchar(100) NULL
Si por otra parte, se quiere definir el mismo campo, pero sin aceptar nulos se tendría que escribir
nombre varchar(100) NOT NULL
Ejemplo de CREATE TABLE con especificación de valores nulos
En el ejemplo siguiente se ve la creación de una tabla con algunos campos que aceptarán valores nulos (director, genero, anoEstreno, anoGrabacion, anoEdicion, Clasificacion y Protagonistas) y otro que no lo hará (titulo) .
CREATE TABLE peliculas ( clave smallint PRIMARY KEY, --LLave primaria titulo varchar(100) NOT NULL, --No permite valores nulos director varchar (100) NULL, --Si permite valores nulos genero varchar(100) NULL, --Si permite valores nulos anoEstreno smallint DEFAULT 2000 NULL CHECK (anoEstreno > 1900), --Si permite valores nulos, por default es 2000 y solo permite valores mayores a 1900 anoGrabacion smallint NULL, --Si permite valores nulos anoEdicion smallint NULL, --Si permite valores nulos clasificacion varchar(20) NULL DEFAULT 'A', --Si permite valores nulos y el default es 'A' protagonistas varchar (300) NULL DEFAULT '',--Si permite valores nulos y el default es una cadena vacía CONSTRAINT unique_tituloUnico UNIQUE (titulo,anoEstreno) );
Una vez definido cada campo, cada vez que se haga un INSERT o un UPDATE a la tabla, el motor de bases de datos se encargará de validar los datos de entrada y si algún valor intentará quebrantar la regla entonces toda la transacción será rechazada y el código generará un error.
Ejemplo de cambio de propiedad de NULL / NOT NULL por medio de un ALTER TABLE
En el caso de que ya exista una tabla, es posible cambiar la propiedad de los campos de aceptar valores nulos. Esto se hace por medio de otro comando DDL llamado ALTER TABLE.
Siguiendo el ejemplo del código anterior, si se quisiera cambiar el campo titulo y aceptar valores nulos, se tendría que ejecutar el siguiente código
ALTER TABLE {
ALTER COLUMN titulo NULL
};
En el caso de cambiar un campo de NOT NULL a NULL es muy fácil, pero en el caso contrario (de NULL a NOT NULL) es más complicado, ya que en caso de existir al menos un campo con un valor nulo, la nueva restricción ya no se podría cumplir y por tanto el comando ALTER TABLE no se podría ejecutar.
Es por ello que es muy importante el pensar detenidamente el impacto a cambios de esta naturaleza, por lo que regularmente estarán a cargo del DBA.