Hola amigos:
Amigos, espero que la navidad haya sido benévola con todos ustedes y que este año 2009 sea de mucha salud y prosperidad.
En esta entrada vamos a conocer un poco sobre la restricción NULL de los campos de las tablas.
Muchos gurús de SQL prefieren cortarse las venas antes que usar y menos recomendar el uso de valores NULL en algunos campos de las tablas, otros por el contrario, usan y recomiendan ampliamente el uso de valores NULL.
¿Cual es la posición correcta?, eso no lo sé ¡, sin embargo hoy vamos a ver el uso de los valores NULL y ustedes tomarán le mejor decisión después de conocer donde podemos aplicar este tipo de valores.
¿Cuáles son los valores NULL?
En palabras sencillas, un valor NULL es cuando el campo esta vacio, no contiene valor alguno.
Se preguntaran, ¿y cómo es eso?; bien, solo para rizar el rizo, dependiendo del tipo de campo será el valor que deberá contener, por ejemplo; si el campo es de tipo CHAR este podrá contener cualquier carácter del alfabeto incluso signos especiales y números, para un campo de tipo INT, DEC, etc., podrá contener solo números y el punto decimal, veamos algunos ejemplo:
cNombre := “Armando”
nSueldo := 15000.00
Cuando los campos no han sido llenados pueden contener los siguientes:
cNombre := “”
nSueldo := 0.00
Pero si permitimos el uso de valores NULL simple y sencillamente los campos están vacios, no contienen ni “” ni 0.00, insisto, están vacios.
¿Cuándo sucede esto?
Para responder a esta pregunta recordemos cual es la sintaxis para definir un campo o columna cuando definimos una tabla:
Nombre_de_la_columna Tipo_de_datos DEFAULT valor_predeterminado [NULL NOT NULL]
Como podemos apreciar en la sintaxis anterior ahí tenemos la posibilidad de permitir que un campo pueda tener valor NULL o no.
Cuando insertamos un nuevo registro en una tabla será necesario que todos los campos del registro contengan un valor pues de lo contrario MySql nos botará un espantoso error, a menos claro, que al definir los campos de la tabla hayamos definido alguno que acepte el valor NULL.
En el caso de haber definido un campo para que acepte el valor NULL y en el insert le proporcionamos algún valor diferente de NULL el valor será almacenado en el campo sin mayor problema, por el contrario, si dejamos el campo sin valor MySql lo registrará con un valor NULL y no tendremos error alguno.
Hasta aquí todo parece indicar que lo recomendable es el uso de valores NULL, sin embargo no nos dejemos llevar por el canto de las sirenas, el uso de valores NULL tiene sus bemoles.
Uno de los problemas que podemos tener en el manejo de valores NULL es, por ejemplo, cuando queremos concatenar dos o más campos, pongamos un ejemplo:
Asumamos que hacemos un insert con los siguientes valores para un registro:
Nombre := “Armando”
Paterno := “Estrada”
Materno :=
Sueldo := 15000.00
El campo Materno lo hemos dejado vacio (NULL).
Si ahora hacemos una consulta así:
SELECT CONCAT(Nombre,’ ‘,Paterno,’ ‘,Materno), Sueldo FROM Tabla
Y mostramos el resultado de la consulta será así:
NULL 15000.00
Evidentemente esto no es lo que queríamos ¡.
Ya vemos como nos cobra factura el uso de valores NULL.
Si bien es cierto que para todo hay una solución, ahora ya no nos parece tan recomendable el uso de valores NULL, no es así?, jejeje.
Pongamos otro caso:
Imaginemos que tenemos una aplicación para Cuentas por cobrar a clientes, posiblemente producto de una Facturación, Y los campos de nuestra tabla que almacena las facturas que nos deben nuestros clientes es así:
Cliente
Factura
Fecha_de_emision
Importe
Fecha_del_pago
Por lógica, cuando el sistema de Facturación emite una factura y esta queda registrada en nuestra tabla de cuentas por cobrar a clientes, aún no tenemos la fecha_del_pago, entonces se hace necesario el uso de valores NULL ¡, ¿están de acuerdo?.
Como verán no es sencillo decantarse por el uso o no uso de valores NULL, para mi la mejor opción es la que ustedes tomen.
Hasta la próxima.
Amigos, espero que la navidad haya sido benévola con todos ustedes y que este año 2009 sea de mucha salud y prosperidad.
En esta entrada vamos a conocer un poco sobre la restricción NULL de los campos de las tablas.
Muchos gurús de SQL prefieren cortarse las venas antes que usar y menos recomendar el uso de valores NULL en algunos campos de las tablas, otros por el contrario, usan y recomiendan ampliamente el uso de valores NULL.
¿Cual es la posición correcta?, eso no lo sé ¡, sin embargo hoy vamos a ver el uso de los valores NULL y ustedes tomarán le mejor decisión después de conocer donde podemos aplicar este tipo de valores.
¿Cuáles son los valores NULL?
En palabras sencillas, un valor NULL es cuando el campo esta vacio, no contiene valor alguno.
Se preguntaran, ¿y cómo es eso?; bien, solo para rizar el rizo, dependiendo del tipo de campo será el valor que deberá contener, por ejemplo; si el campo es de tipo CHAR este podrá contener cualquier carácter del alfabeto incluso signos especiales y números, para un campo de tipo INT, DEC, etc., podrá contener solo números y el punto decimal, veamos algunos ejemplo:
cNombre := “Armando”
nSueldo := 15000.00
Cuando los campos no han sido llenados pueden contener los siguientes:
cNombre := “”
nSueldo := 0.00
Pero si permitimos el uso de valores NULL simple y sencillamente los campos están vacios, no contienen ni “” ni 0.00, insisto, están vacios.
¿Cuándo sucede esto?
Para responder a esta pregunta recordemos cual es la sintaxis para definir un campo o columna cuando definimos una tabla:
Nombre_de_la_columna Tipo_de_datos DEFAULT valor_predeterminado [NULL NOT NULL]
Como podemos apreciar en la sintaxis anterior ahí tenemos la posibilidad de permitir que un campo pueda tener valor NULL o no.
Cuando insertamos un nuevo registro en una tabla será necesario que todos los campos del registro contengan un valor pues de lo contrario MySql nos botará un espantoso error, a menos claro, que al definir los campos de la tabla hayamos definido alguno que acepte el valor NULL.
En el caso de haber definido un campo para que acepte el valor NULL y en el insert le proporcionamos algún valor diferente de NULL el valor será almacenado en el campo sin mayor problema, por el contrario, si dejamos el campo sin valor MySql lo registrará con un valor NULL y no tendremos error alguno.
Hasta aquí todo parece indicar que lo recomendable es el uso de valores NULL, sin embargo no nos dejemos llevar por el canto de las sirenas, el uso de valores NULL tiene sus bemoles.
Uno de los problemas que podemos tener en el manejo de valores NULL es, por ejemplo, cuando queremos concatenar dos o más campos, pongamos un ejemplo:
Asumamos que hacemos un insert con los siguientes valores para un registro:
Nombre := “Armando”
Paterno := “Estrada”
Materno :=
Sueldo := 15000.00
El campo Materno lo hemos dejado vacio (NULL).
Si ahora hacemos una consulta así:
SELECT CONCAT(Nombre,’ ‘,Paterno,’ ‘,Materno), Sueldo FROM Tabla
Y mostramos el resultado de la consulta será así:
NULL 15000.00
Evidentemente esto no es lo que queríamos ¡.
Ya vemos como nos cobra factura el uso de valores NULL.
Si bien es cierto que para todo hay una solución, ahora ya no nos parece tan recomendable el uso de valores NULL, no es así?, jejeje.
Pongamos otro caso:
Imaginemos que tenemos una aplicación para Cuentas por cobrar a clientes, posiblemente producto de una Facturación, Y los campos de nuestra tabla que almacena las facturas que nos deben nuestros clientes es así:
Cliente
Factura
Fecha_de_emision
Importe
Fecha_del_pago
Por lógica, cuando el sistema de Facturación emite una factura y esta queda registrada en nuestra tabla de cuentas por cobrar a clientes, aún no tenemos la fecha_del_pago, entonces se hace necesario el uso de valores NULL ¡, ¿están de acuerdo?.
Como verán no es sencillo decantarse por el uso o no uso de valores NULL, para mi la mejor opción es la que ustedes tomen.
Hasta la próxima.
7 comentarios:
Armando:
Sigo tu blog con gran interés, me gusta mucho como explicas las cosas y me permito agregar mis 2 centavos:
Yo soy de los que no usa valores NULL en las estructuras de las tablas SQL por una sencilla razón:
NULL <> NIL
Me explico:
Yo uso mucho Advantage Database Server, en su formato de tabla nativas: el ADT.
Este ADT tiene propiedades similares a las tablas SQL, es decir, acepta NULL como valor en los tipos de campo.
Lo que hemos notado, y no se si lo haz probado en MySQL, es que la función EMPTY() no funciona sobre campos que tienen valor NULL, siempre regresa .F.
¿ Porqué ? porque NULL no es lo mismo que NIL, NULL al final de cuentas es un valor, vacio, pero es un valor, cuando tu haces una comparación en xHarbour como por ejemplo:
IF EMPTY(oDataSet:aFields(1):value)
...
Y da la casualidad que el valor del campo es NULL entonces aunque este vacío regresa .F.
Por eso, mi sugerencia es:
No usen campos NULL y si el valor va a ir vacío sustituyánlo por su equivalente xBase vacío, por ejemplo: si es caracter por un SPACE(xxx), si es numérico por un 0, si es lógico por un .F. y si es fecha o DateTime por su equivalente vacio de xHarbour.
Maestro:
Todos los comentarios son bienvenidos, más cuando se tratan de coemtarios, que como el tuyo, enriquecen lo publicado.
Gracias por el aporte.
Saludos
Hola Armando
Al igual que Rene visito tu blog con beneplacito para aprender mas sobre este gran mundo del SQL y del cual haces explicaciones claras y sencillas de entender. Espero continues en esta bonita tarea aunque se que te demanda tiempo.
Saludos
Martin
Martín:
Me complace saber que mi aportación te ha servido.
Cuando me inicie en el mundo SQL busque con ansias locas algo parecido, encontre mucho apoyo pero de manera asilada así que me surgió la idea de poner mi granito de arena en la forma como yo lo esperaba encontrar.
Ojalá se sigan sumando aportaciones como la del Master René Flores para enriquecer más este blog.
Mientras haya tiempo libre por aquí seguire escribiendo.
Saludos
hay ocacion en las quelgunas consulas combinadas,, muestran resulados tipo null, como coando no hay correspondencia conn el JOIN, asi que esta sentencia la uso con optimo resultado:
cProduc := "SELECT *, precio_neto, IFNULL((SELECT registro FROM imagenes WHERE imagenes.cod_producto = productos.cod_producto),0) AS imagen FROM productos WHERE cod_producto <> '' "
hay ocacion en las quelgunas consulas combinadas,, muestran resulados tipo null, como cuando no hay correspondencia con el JOIN, asi que esta sentencia la uso con optimo resultado:
cProduc := "SELECT *, precio_neto, IFNULL((SELECT registro FROM imagenes WHERE imagenes.cod_producto = productos.cod_producto),0) AS imagen FROM productos WHERE cod_producto <> '' "
Willi:
Me alegra que estes por aquí, bienvenido.
Como podemos ver ya hay dos opiniones encontradas, una en contra de usar valores NULL y otra a favor de usarlos.
Precisamente esa era mi intención con esta entrada; que se viertan opiniones y que cada quien use o no use valores NULL como mejor le convenga.
Saludos
Publicar un comentario en la entrada