2009-11-15 5 views

ответ

48

NULL означает, что вы не должны указать значение для поля ...

NOT NULL означает, что вы должны указать значение для поля.

Например, если вы создаете таблицу зарегистрированных пользователей для системы, вы можете захотеть убедиться, что идентификатор пользователя всегда заполнен значением (то есть NOT NULL), но поле имени необязательных супругов может (NULL)

+3

Простейшее ответить кто мог бы дал. ;) – Zack

+0

Вне JDBC MySQL позволяет опустить значение для столбца 'NOT NULL' *, если * в столбце есть' DEFAULT'. Я заметил, что это не имеет смысла для некоторых программистов, но так оно и работает. – staticsan

+1

@staticsan Это неправда или, по крайней мере, очень вводящая в заблуждение, сказать, что «MySQL позволяет вам опустить значение для столбца« NOT NULL »» - должно быть задано некоторое значение (это именно то, что означает «NOT NULL'), и если вы не поставляйте его, тогда MySQL будет предоставлять значение «DEFAULT». Если столбец не определяет значение DEFAULT, MySQL может по-прежнему предоставлять неявное значение по умолчанию для типа данных, если строгий режим не включен. ([docs link] (https://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html)) – Air

4

NOT NULL означает, что столбец не может иметь значение NULL, вместо этого, если ничего не указано при вставке строки для этого столбца, он будет использовать все значения по умолчанию (или если не указано значение по умолчанию, то, для этого типа).

Поля, которые не являются NOT NULL, потенциально могут иметь свое значение как NULL (что по существу означает отсутствие/неизвестное/неуказанное значение). NULL ведет себя иначе, чем нормальные значения, see here for more info.

+0

более «технический» ответ :) – Zack

2

NOT NULL столбец ограничение и следует использовать, когда у вас есть столбец, которого нет в первичном ключе (первичные ключи по своей сути не-нуль, так что глупо говорить NOT NULL явно о них), из которых вы знаете, значения будут всегда (неизвестно или отсутствует), поэтому нет нулей в этом столбце.

NULL - это ключевое слово, встречающееся во многих контекстах, в том числе в качестве ограничения столбца, где оно означает то же, что и значение по умолчанию (то есть, нули разрешены), но также и во многих других контекстах, например. для ввода нулевого значения в столбце в качестве части инструкции INSERT...VALUES.

8

В чем разница между NULL и NOT NULL?

При создании таблицы или добавить столбец в таблицу, необходимо указать значение столбца необязательность, используя либо NULL или NOT NULL. NOT NULL означает, что столбец не может иметь значение NULL для любой записи; NULL означает, что NULL является допустимым значением (даже если столбец имеет ограничение внешнего ключа). Поскольку NULL не является значением, вы можете понять, почему некоторые называют его опциональным - потому что для таблицы базы данных требуется, чтобы для столбца должен быть экземпляр столбца для каждой записи в таблице.

И когда они должны использоваться?

Это определяется вашими бизнес-правилами.
Как правило, вы хотите, чтобы как можно больше столбцов было NOT NULL, потому что вы хотите быть уверены, что данные всегда есть.

10

Я хотел бы предложить

  • Используйте NOT NULL, на каждом поле, если вы можете
  • Использование NULL, если есть разумная причина, он может быть пустым

Имея поля, которые не имеют значащее значение для NULL с нулевым значением, вероятно, приведет к ошибкам, когда nulls вводят их случайно. Использование NOT NULL предотвращает это.

Наиболее распространенной причиной для полей NULL является то, что у вас есть поле внешнего ключа, которое является параметром, то есть не всегда связанным, для отношения «нуль или один».

Если вы обнаружили, что есть таблица с большим количеством колонн, многие из которых могут быть NULL, что начинает звучать как антипаттерн, рассмотрим, имеет ли вертикальное разделение смысл в контексте приложения :)

Существует еще один полезный использование для NULL - создание всех столбцов в индексе NULL остановит создание индексной записи для этой строки, которая оптимизирует индексы; вам может понадобиться индексировать только очень небольшое подмножество строк (например, для «активного» флага, установленного всего на 1% или что-то еще) - создание индекса, который начинается с столбца, который обычно равен NULL, сохраняет пространство и оптимизирует этот индекс.

2

Также обратите внимание, что NULL не является чем-то другим, даже не для самого NULL.

Например:

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) 

Это определение NULL очень полезно, когда вам нужен уникальный ключ на колонке, частично заполненной. В таком случае вы можете просто оставить все пустые значения как NULL, и это не вызовет нарушения ключа уникальности, так как NULL! = NULL.

Вот пример того, как вы можете увидеть, если что-то 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) 
2

Как и другие ответили, NOT NULL просто означает, что NULL не допускаемое значение. Тем не менее, вы всегда будете иметь возможность пустой строки '' (для varchar) или 0 (для int) и т.д.

Одна хорошая особенность при использовании NOT NULL является то, что вы можете получить сообщение об ошибке или предупреждение, если вы забудете установить колонки значение в течение INSERT. (При условии, NOT NULL столбца не имеет DEFAULT)


Основная икота с разрешительными NULL колонн является то, что они никогда не будут найдены с (не равно) <>. Например, с помощью следующих category сек

Desktops 
Mobiles 
NULL -- probably embedded devices 

Оператор = работает, как ожидалось

select * from myTable where category="Desktops"; 

Однако оператор <> исключает любые NULL записи.

select * from myTable where category<>"Mobiles"; 
-- returns only desktops, embedded devices were not returned 

Это может быть причиной тонких ошибок, особенно если столбец не имеет NULL данных во время тестирования начального, но позже некоторые NULL значений добавляются в связи с последующим развитием. По этой причине я установил все столбцы в NOT NULL.


Однако, это может быть полезно, чтобы NULL значения при использовании UNIQUEKEY/INDEX. Обычно уникальный ключ требует, чтобы столбец (или комбинация столбцов) был уникальным для всей таблицы. Уникальные ключи - отличная защита, которую база данных будет обеспечивать для вас.

В некоторых случаях вам может понадобиться защита для большинства строк, но есть исключения.

Если какая-либо колонка, на которую ссылается данный номер UNIQUE KEY, - NULL, то уникальность для этой строки больше не будет применяться. Очевидно, что это будет работать, только если вы разрешите NULL s в этой колонке, понимая, что икота я объяснил выше.


Если вы решили разрешить NULL значения, рассмотрим написание <> заявления с дополнительным условием для обнаружения NULL с.

select * from myTable where category<>"Desktops" or category is null; 
+1

Бит о < and > Оператор, не работающий с NULL, является важным прозрением, спасибо за обмен. –

Смежные вопросы