with - values null mysql
MySQL NULL o NOT NULL ¿Esa es la pregunta? (7)
¿Cuál es la diferencia entre NULL y NOT NULL? ¿Y cuándo deberían ser utilizados?
¿Cuál es la diferencia entre NULL y NOT NULL?
Al crear una tabla o agregar una columna a una tabla, debe especificar la opción de valor de columna usando NULL
o NOT NULL
. NOT NULL
significa que la columna no puede tener un valor NULL
para ningún registro; NULL
significa que NULL
es un valor permitido (incluso cuando la columna tiene una restricción de clave externa). Como NULL
no es un valor, puede ver por qué algunos lo llaman opcionalidad, porque la tabla de la base de datos requiere que para tener una columna, debe haber una instancia de la columna para cada registro dentro de la tabla.
¿Y cuándo deberían ser utilizados?
Eso está determinado por las reglas de su negocio.
En general, desea que la mayor cantidad posible de columnas NOT NULL
sea NOT NULL
porque quiere asegurarse de que los datos estén siempre allí.
Como otros han respondido, NOT NULL
simplemente significa que NULL
no es un valor permitido. Sin embargo, siempre tendrá la opción de cadena vacía ''''
(para varchar
) o 0
(para int
), etc.
Una característica interesante al utilizar NOT NULL
es que puede obtener un error o una advertencia si olvida establecer el valor de la columna durante INSERT
. (suponiendo que la columna NOT NULL
no tiene valor DEFAULT
)
El principal inconveniente de permitir columnas NULL
es que nunca se encontrarán con el operador <>
(no igual). Por ejemplo, con la siguiente category
s
Desktops
Mobiles
NULL -- probably embedded devices
El operador =
funciona como se esperaba
select * from myTable where category="Desktops";
Sin embargo, el operador <>
excluirá cualquier entrada NULL
.
select * from myTable where category<>"Mobiles";
-- returns only desktops, embedded devices were not returned
Esto puede ser la causa de errores sutiles, especialmente si la columna no tiene datos NULL
durante la prueba inicial, pero luego se agregan algunos valores NULL
debido al desarrollo posterior. Por este motivo, configuré todas las columnas como NOT NULL
.
Sin embargo, puede ser útil permitir valores NULL
cuando se utiliza una KEY
/ INDEX
UNIQUE
. Normalmente, una clave única requiere que la columna (o combinación de columnas) sea única para toda la tabla. Las claves únicas son una gran protección que la base de datos aplicará por usted.
En algunos casos, es posible que desee la protección para la mayoría de las filas, pero hay excepciones.
Si cualquier columna a la que hace referencia esa UNIQUE KEY
particular es NULL
, entonces la exclusividad ya no se aplicará para esa fila. Obviamente, esto solo funcionaría si permite NULL
s en esa columna, entendiendo el inconveniente que expliqué anteriormente.
Si decide permitir valores NULL
, considere escribir sus declaraciones <>
con una condición adicional para detectar NULL
s.
select * from myTable where category<>"Desktops" or category is null;
NULL significa que no tiene que proporcionar un valor para el campo ...
NOT NULL significa que debe proporcionar un valor para los campos.
Por ejemplo, si está creando una tabla de usuarios registrados para un sistema, es posible que desee asegurarse de que el ID de usuario esté siempre lleno con un valor (es decir, NO NULO), pero el campo de nombre de cónyuges opcional puede dejarse vacío ( NULO)
También tenga en cuenta que NULL no es igual a cualquier otra cosa, incluso no a NULL.
Por ejemplo:
mysql> select if(NULL=NULL, "null=null", "null!=null");
+------------------------------------------+
| if(NULL=NULL, "null=null", "null!=null") |
+------------------------------------------+
| null!=null |
+------------------------------------------+
1 row in set (0.00 sec)
Esta definición de NULL es muy útil cuando necesita una clave única en una columna que está parcialmente llena. En tal caso, puede dejar todos los valores vacíos como NULL, y no causará ninguna violación de la clave de exclusividad, ya que NULL! = NULL.
Aquí hay un ejemplo de cómo puedes ver si algo es NULL:
mysql> select if(null is null, "null is null", "null is not null");
+------------------------------------------------------+
| if(null is null, "null is null", "null is not null") |
+------------------------------------------------------+
| null is null |
+------------------------------------------------------+
1 row in set (0.01 sec)
Yo sugeriría
- Use NOT NULL en cada campo si puede
- Use NULL si hay una razón sensata por la que puede ser nulo
Tener campos que no tienen un significado significativo para nulo NULL es probable que introduzca errores, cuando los nulos los ingresen por accidente. Usar NOT NULL evita esto.
La razón más común para los campos NULL es que tiene un campo de clave externa que es opciones, es decir, no siempre vinculado, para una relación "cero o uno".
Si encuentra que tiene una tabla con muchas columnas, muchas de las cuales pueden ser NULL, eso comienza a sonar como un antipattern, considere si la partición vertical tiene más sentido en el contexto de su aplicación :)
Hay otro uso útil para NULL: hacer que todas las columnas de un índice NULL detengan la creación de un registro de índice para esa fila, lo que optimiza los índices; Es posible que desee indexar solo un subconjunto de filas muy pequeño (por ejemplo, para un marcador "activo" establecido en solo 1% o algo así), lo que hace que un índice que comience con una columna que normalmente es NULL ahorre espacio y optimice ese índice.
NOT NULL
es una restricción de columna y debe usarse cuando tiene una columna que no está en una clave primaria (las claves primarias son intrínsecamente no nulas, por lo que es tonto decir NOT NULL
explícitamente sobre ellas) de las cuales usted sabe que los valores siempre serán conocidos (no es desconocido o falta) por lo que no hay necesidad de nulos en esa columna.
NULL
es una palabra clave que ocurre en muchos contextos, incluso como una restricción de columna, donde significa lo mismo que el valor predeterminado (es decir, se permiten nulos), pero también en muchos otros contextos, por ejemplo, para insertar un nulo en una columna como parte de una declaración INSERT...VALUES
.
NOT NULL
significa que una columna no puede tener el valor NULL
en cambio, si no se especifica nada al insertar una fila para esa columna, usará el valor predeterminado especificado (o si no se especifica ningún valor predeterminado, cualquiera sea el predeterminado de MySQL para ese tipo )
Los campos que no son NOT NULL
pueden tener potencialmente su valor como NULL
(que esencialmente significa un valor faltante / desconocido / no especificado). NULL
comporta de manera diferente a los valores normales, mira aquí para más información .