Какой смысл в "NOT NULL DEFAULT"? - PullRequest
       16

Какой смысл в "NOT NULL DEFAULT"?

22 голосов
/ 12 ноября 2009

Я видел это на многих полях БД из проекта, над которым я работал, где столбец будет определен не нулевым, но по умолчанию будет иметь пустую строку. какой смысл делать это? Если вы разрешите пустую строку, почему бы просто не позволить полю быть пустым?

Ответы [ 7 ]

36 голосов
/ 12 ноября 2009

NULL имеют специальное поведение: сравнение чего-либо с NULL возвращает NULL, что является чем-то иным, чем false или 0. Это означает «неизвестно».

Например, возьмите эту таблицу:

 user_id | gender
------------------
 1       | NULL
 2       | 'M'
 3       | 'F'
 4       | 'F'

SELECT * FROM mytable WHERE gender = 'M' вернет 1 строку, как и ожидалось

SELECT * FROM mytable WHERE gender != 'M' вернет 2 строки, а НЕ 3 строки.

SELECT * FROM mytable WHERE gender != 'M' OR gender IS NULL вернет ожидаемые 3 строки.


Редактировать: Для некоторых приложений использование 0 (или, не дай Бог, другое "магическое число") вместо NULL даже не рекомендуется (единицы или точные значения не имеют значения в этом примере):

 Date       | Temperature 
--------------------------
 2010-01-01 | 10          
 2010-01-02 | 4
 2010-01-03 | 0
 2010-01-04 | -22
 2010-01-05 | -45
 2010-01-06 | NULL
 2010-01-07 | -34

Здесь NULL 6 января означает «значение неизвестно» - возможно, потому, что температура была настолько низкой, что датчик термометра перестал реагировать. Однако это совершенно другое значение, чем 3 января, когда температура была 0, то есть 0 градусов.

Кроме того, как упоминает @Bill Karwin, значения NULL ведут себя особенно в агрегатных функциях (COUNT, SUM, AVG и т. Д.): Вычисление AVG(Temperature) на вышеуказанных данных даст вам -14.5, так как Пустая строка игнорируется.

11 голосов
/ 12 ноября 2009

null и "" - это не одно и то же, поэтому здесь нет противоречия.

В чем смысл семантического значения нуль / "", зависит от индивида и часто является "религиозным" вопросом. Для некоторых людей в некоторых схемах, конечно, они могут быть одинаковыми, но это не обязательно. Например, «» может означать «я явно просил пользователя ввести данные, и они решили ничего не вводить», а нулевое значение может означать «я даже не запрашивал ввод».

4 голосов
/ 12 ноября 2009

Существует разница между нулевым значением и пустой строкой - по крайней мере, в SQL.

SELECT LENGTH('tata');
4

SELECT LENGTH(NULL);
NULL

SELECT LENGTH('tata')-LENGTH('');
4

SELECT LENGTH('tata')-LENGTH(NULL);
NULL
1 голос
/ 12 ноября 2009

Большинство языков программирования, которые взаимодействуют с базой данных, изначально не поддерживают NULL, который работает так же, как в базе данных. Например, в C #, null <> DbNull.Value. В VB большинство типов данных не могут справиться с нулевой семантикой, например вы не могли сохранить ноль в Date или Int и т. д. Сокращая количество нулей, которые видят клиентские программы, тем меньше головной боли. В случае VB закрывающая вещь, которая означает null для строк, - это Empty, что ближе к неинициализированному, не совсем то же самое значение, что и NULL в смысле «не известно»

0 голосов
/ 12 ноября 2009

В дополнение к тому, что упомянул @Piskvor, эта практика также существует, чтобы предотвратить некоторые потенциальные исключения NullPointerException в логике приложения при заполнении объектов / объектов и т. Д. После чтения из БД

0 голосов
/ 12 ноября 2009

Мы не допускаем нулевые значения, поскольку программный доступ к полю из таблицы данных со значением DBnull вызывает исключение, в то время как пустая строка имеет значение и, следовательно, не вызывает ошибок.

0 голосов
/ 12 ноября 2009

Потому что иногда на некоторых языках запрос "select" дает вам string NULL , и вам придется проверять, является ли это реальной строкой с содержимым "NULL" или это действительно ноль.

С "" это проще всего (ИМХО)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...