mysql — default null, но значение notNULL. Структура таблиц, значение по умолчанию

Вопрос задан

Изменён 11 дней назад

Просмотрен 923 раза

вопрос возник из комментов отсюда подсчет количества.

Есть такие таблички

mysql> describe usopt;
  +---------------+---------------------+------+-----+------------------------------------------+
  | Field         | Type                | Null | Key | Default                                  |
  +---------------+---------------------+------+-----+------------------------------------------+
  | uid_usopt     | int(10) unsigned    | NO   | PRI | NULL                                     |
  | usname        | varchar(25)         | NO   |     | NULL                                     |
  | skinid_usopt  | int(10) unsigned    | NO   |     | 1                                        |
mysql> describe skin;
+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+
| skinid       | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| skin_name    | varchar(32)      | NO   |     | NULL    |                |
| uid_skinfrom | int(10) unsigned | NO   | MUL | NULL    |                |
| skin_way     | varchar(32)      | NO   |     | NULL    |                |
| date_skin    | int(10) unsigned | NO   | MUL | NULL    |                |

Обратите внимание на то что у

  +--------------+------------------+------+-----+---------+----------------+
  | Field        | Type             | Null | Key | Default | Extra          |
  +--------------+------------------+------+-----+---------+----------------+
 | skinid        | int(10) unsigned    | NO   | PRI | NULL    | auto_increment |
 | uid_usopt     | int(10) unsigned    | NO   | PRI | NULL                                     |

 | usname        | varchar(25)         | NO   |     | NULL   

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

Разумеется что перед вставкой в таблицы в php кода всегда есть валидация данныз, но вдруг случайно или не случайно что-то пойдет не так?

Я задавал значения NOT NULL. NULL по умолчания я специально НЕ ставил. Это субд, которой я пользуюсь, ставит NULL.

Кстати я к этому случайно додумался ранее (летом2016), когда задавал тут вопросы.

Не все то что кажется на первый взгляд абсолютным бредом, является таковым.

ВНИМАНИЕ! вопрос: Правильно ли я сделал? Я считаю что это действительно сильно! Или нет?

  • mysql
  • sql
  • null

7

Речь идет о разных, на прямую между собой не связанных вещах. Если было указано, что колонка NOT NULL, никто же не мешает задать значение по умолчанию. Если оно не указано, то значение по умолчанию — NULL. Для уникальных ключей смысла устанавливать значение по умолчанию, понятно, смысла нет.

Дополню ответ. Делать столбец NOT NULL и ставить значение по умолчанию не всегда целесообразно.

Как здесь:

+---------------+---------------------+------+-----+------------------------------------------+
| Field         | Type                | Null | Key | Default                                  |
+---------------+---------------------+------+-----+------------------------------------------+
| skinid_usopt  | int(10) unsigned    | NO   |     | 1                              

Если по этому столбцу будет поиск, то лучше сделать его NULLABLE и создать по нему индекс. В индексе значения NULL не сохраняются, поэтому он будет небольшим и эффективным.

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

mysql — Если поле PRIMARY KEY, то NOT NULL не нужен?

Есть поле, являющееся первичным ключом. Это поле не должно содержать «нулевых» значений.

Есть ли необходимость в NOT NULL, или достаточно только PRIMARY KEY?

8

У уникальных полей есть одна забавная особенность. Уникальность определяется равенством. Но NULL не равен NULL! Поэтому значения NULL можно добавлять в столбец с проверкой на уникальность в любом количестве строк!

А первичный ключ должен уникально идентифицировать каждую строку по равенству значения этого ключа. Потому значение NULL для первичного ключа не имеет смысла. При сравнении равенством он просто никогда не совпадёт ни с какой строкой.

Это распространяется на все SQL-совместимые базы данных.
Но процитирую определение первичного ключа с dev.mysql.com:

A set of columns—and by implication, the index based on this set of columns—that can uniquely identify every row in a table.

As such, it must be a unique index that does not contain any NULL values.

Набор столбцов и индекс по этому набору столбцов, способный однозначно идентифицироать каждую строку в таблице. Это уникальный индекс, не содержащий значений NULL.

Так что да, PRIMARY KEY требует, чтобы его столбцы были NOT NULL.

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

Синтаксис определения первичного ключа я встречал трёх видов:

  • Прямо при определении типа колонки, добавив PRIMARY KEY к её типу:

    CREATE TABLE things ( id integer PRIMARY KEY )
    
    • Указание NOT NULL может быть необязательным. Но в MySQL, судя по примерам (документация не особо помогла), обязательно. В PostgreSQL же нет: там считается, что PRIMARY KEY в типе столбца включает в себя NOT NULL.
  • При определении первичного ключа в составе определения таблицы (но не её :столбцов)

    CREATE TABLE things ( id integer NOT NULL, PRIMARY KEY(id) )
    
    • NOT NULL обязательно, иначе упоминание колонки в PRIMARY KEY будет конфликтовать с уже объявленным.
  • При определении первичного ключа на уже созданной таблице отдельно.

    • NOT NULL обязательно, т. к. таблица уже определена.

5

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

Значения MySQL NULL — IS NULL и IS NOT NULL

❮ Предыдущий Далее ❯


Что такое значение NULL?

Поле со значением NULL является полем без значения.

Если поле в таблице является необязательным, можно вставить новую запись или обновить запись, не добавляя значение в это поле. Тогда поле будет сохраняется со значением NULL.

Примечание: Значение NULL отличается от нулевого значения или поля, которое содержит пробелы. Поле со значением NULL — это поле, оставленное пустым. при создании записи!


Как проверить значения NULL?

Невозможно проверить значения NULL с помощью операторов сравнения, таких как =, < или <>.

Нам придется использовать IS NULL и IS NOT NULL вместо операторов.

IS NULL Синтаксис

SELECT имена_столбцов
FROM имя_таблицы
ГДЕ имя_столбца IS NULL;

IS NOT NULL Синтаксис

SELECT имена столбцов
ОТ имя_таблицы
ГДЕ имя_столбца НЕ НУЛЕВОЕ;


Демонстрационная база данных

Ниже приведена выборка из таблицы «Клиенты» в образце «Борей» база данных:

CustomerID ИмяКлиента Контактное имя Адрес Город Почтовый индекс Страна
1 Альфред Футтеркисте Мария Андерс ул. Обере 57 Берлин 12209 Германия
2 Ана Трухильо Emparedados y helados Ана Трухильо Авда. Конститусьон 2222 Мексика Д.Ф. 05021 Мексика
3 Антонио Морено Такерия Антонио Морено Матадерос 2312 Мексика Д.Ф. 05023 Мексика
4 Вокруг Рога Томас Харди Ганноверская площадь, 120 Лондон ВА1 1ДП Великобритания
5 Берглундс снабжение Кристина Берглунд Бергувсвеген 8 Лулео S-958 22 Швеция


Оператор IS NULL

Оператор IS NULL используется для проверки пустых значений (значений NULL).

Следующий SQL перечисляет всех клиентов со значением NULL в поле «Адрес»:

Пример

SELECT CustomerName, ContactName, Address
FROM Customers
WHERE Address НУЛЕВОЙ;

Попробуйте сами »

Совет: Всегда используйте IS NULL для поиска значений NULL.


Оператор IS NOT NULL

Оператор IS NOT NULL используется для проверки непустых значений (NOT NULL ценности).

Следующий SQL перечисляет всех клиентов со значением в поле «Адрес»:

Пример

SELECT CustomerName, ContactName, Address
FROM Customers
WHERE Address НЕ НУЛЬ;

Попробуйте сами »


Проверьте себя с помощью упражнений

Упражнение:

Выберите все записи из Customers , где Столбец PostalCode пуст.

ВЫБЕРИТЕ * ИЗ клиентов
КУДА ;
 

Запустить Упражнение

❮ Предыдущий Далее ❯


НОВИНКА

Мы только что запустили
Видео W3Schools

Узнать

ВЫБОР ЦВЕТА
КОД ИГРЫ

Играть в игру




Top Tutorials
Учебник HTML
Учебник CSS
Учебник JavaScript
Учебник How To
Учебник SQL
Учебник Python
Учебник по W3. CSS
Учебник по Bootstrap
Учебник по PHP
Учебник по Java
Учебник по C++
Учебник по jQuery

Основные ссылки
Справочник по HTML
Справочник по CSS
Справочник по JavaScript
Справочник по SQL
Справочник по Python
Справочник по W3.CSS
Справочник по Bootstrap
Справочник по PHP
Цвета HTML
Справочник по Java
Справочник по Angular
Справочник по jQuery

Лучшие примеры Примеры HTML
Примеры CSS
Примеры JavaScript
Примеры инструкций
Примеры SQL
Примеры Python
Примеры W3.CSS
Примеры Bootstrap
Примеры PHP
Примеры Java
Примеры XML
Примеры jQuery


FORUM | О

W3Schools оптимизирован для обучения и обучения. Примеры могут быть упрощены для улучшения чтения и обучения. Учебники, ссылки и примеры постоянно пересматриваются, чтобы избежать ошибок, но мы не можем гарантировать полную правильность всего содержания. Используя W3Schools, вы соглашаетесь прочитать и принять наши условия использования, куки-файлы и политика конфиденциальности.

Copyright 1999-2022 Refsnes Data. Все права защищены.
W3Schools работает на основе W3.CSS.

Что означает NULL и NOT NULL в базе данных MySQL

спросил

Изменено 10 лет, 1 месяц назад

Просмотрено 18 тысяч раз

2

Новинка! Сохраняйте вопросы или ответы и организуйте свой любимый контент.
Узнать больше.

всякий раз, когда мы создаем нашу таблицу в базе данных mysql, там присутствует опция нулевого флажка. и если щелкнуть по нему, он также принимает нулевое значение, а если он остается непроверенным, то также принимает нулевые значения. Что это значит?

  • mysql
  • база данных

1

NULL используется для представления «нет значения» и позволяет различать 1 и 0, истину или ложь или пустую строку и строку с содержимым. Это похоже на nil в Ruby, null в JavaScript или NULL в PHP.

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

Столбцы, которые могут быть NULL , требуют почти незначительного объема дополнительной памяти на строку, один бит, для хранения флага NULL или NOT NULL .

Помните, что NULL в MySQL необычен тем, что он не больше, не меньше и не равен любому другому значению. Вот почему IS NULL и IS NOT NULL необходимы для логических сравнений.

Флажок, вероятно, устанавливает значение по умолчанию равным нулю. Также может быть поле, указывающее, принимает ли поле нулевые значения. Null в основном означает «пусто или ничего» (в VB).

Null в основном означает «нет значения». Если вы разрешаете пустые значения, вам необходимо убедиться, что ваш код может обрабатывать этот столбец, не содержащий значения. Другой подход — это определенное «пустое» значение для каждого столбца (например, 0 для целого числа). Иногда это может потребовать меньше усилий, чем обработка нулевого значения.

Как отмечено HLGEM ниже: я не пытаюсь сказать, что 0 эквивалентен нулю. Рассмотреть возможность: БД со столбцом StockOnHand.

0 означает, что вы знаете, что в наличии нет товара. Null на самом деле означает неизвестность (у вас есть акции, у вас их может и не быть)

В зависимости от приложения, возможно, вы решите рассматривать «неизвестно» так же, как «нет на складе» — в этом случае вы можете использовать «без нулей» и просто иметь значение 0.