Подтвердить что ты не робот

MySQL NULL или NOT NULL Это вопрос?

В чем разница между NULL и NOT NULL? И когда они должны использоваться?

4b9b3361

Ответ 1

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

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

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

Ответ 2

Я бы предложил

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Также обратите внимание, что 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)

Ответ 7

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

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


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

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 при использовании UNIQUE KEY/INDEX. Обычно уникальный ключ требует, чтобы столбец (или комбинация столбцов) был уникальным для всей таблицы. Уникальные ключи - отличная защита, которую база данных будет обеспечивать для вас.

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

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


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

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

Ответ 8

Если вы не уверены, используйте NOT NULL.

Несмотря на распространенное мнение, NOT NULL не требует от вас заполнения всех полей; это просто означает, что все, что вы пропустите, будет иметь значение по умолчанию. Так что нет, это не значит боль. Кроме того, NULL менее эффективен с точки зрения индексации и вызывает множество крайних ситуаций при обработке того, что вы получаете из запроса.

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

Так почему же они так любят NULL?

Потому что это описательно. Это имеет семантическое значение, типа "Нна, подожди, это не просто пустая строка, это намного более экзотично - это недостаток информации!" Они объяснят, как по-разному говорить "время 00:00" и "я не знаю, который час". И это действительно; это просто требует дополнительных усилий, чтобы справиться с этим. Поскольку система будет выделять дополнительное пространство для информации "есть ли вообще значение", и ей постоянно будет трудно ее проверить. Так что ради крошечного кусочка семантической красоты вы жертвуете временем и хранением. Не сильно, но все же.

Весь этот феномен напоминает мне старые добрые дебаты об isset, где люди так или иначе одержимы красотой просмотра несуществующего индекса массива и получения сообщения об ошибке. Это совершенно бессмысленно. Практические значения по умолчанию являются благословением, они упрощают работу в стиле "вы знаете, что я имею в виду", и вы можете написать более читабельный, более краткий, более выразительный код, который будет иметь смысл даже после того, как вы потратите 4 года на другие проекты.

Неизбежные NULL

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

Иначе? NOT NULL - это удобно, эффективно и дает меньше сюрпризов. В свою очередь, некоторые люди с семантико-компульсивным расстройством будут называть его невежественным и возмутительным. (Который не вещь, но должен быть.)

Вам решать :)