Определение столбца SQL: значение по умолчанию, а не избыточное значение NULL?


86

Я много раз видел следующий синтаксис, который определяет столбец в операторе создания / изменения DDL:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"

Возникает вопрос: поскольку указано значение по умолчанию, необходимо ли также указывать, что столбец не должен принимать значения NULL? Другими словами, DEFAULT не делает NOT NULL избыточным?

Ответы:


126

DEFAULTэто значение, которое будет вставлено при отсутствии явного значения в операторе вставки / обновления. Предположим, у вашего DDL не было NOT NULLограничения:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault"

Тогда вы могли бы выпустить эти заявления

-- 1. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B) VALUES (NULL, NULL);

-- 2. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT);

-- 3. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B, col) DEFAULT VALUES;

-- 4. This will insert NULL into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL);

В качестве альтернативы вы также можете использовать операторы DEFAULTin в UPDATEсоответствии со стандартом SQL-1992 :

-- 5. This will update "MyDefault" into tbl.col
UPDATE tbl SET col = DEFAULT;

-- 6. This will update NULL into tbl.col
UPDATE tbl SET col = NULL;

Обратите внимание, что не все базы данных поддерживают все эти стандартные синтаксисы SQL. Добавление NOT NULLограничения вызовет ошибку с операторами 4, 6, пока 1-3, 5они остаются действительными. Итак, чтобы ответить на ваш вопрос: нет, они не лишние.


Я перешел по вашей ссылке (к вашему сообщению в блоге), ожидая увидеть объяснение (возможно, с некоторыми цифрами) огромного влияния на производительность запросов, но увидел лишь краткое повторение того, что оно оказывает влияние. Без обид, но ссылка немного вводит в заблуждение.
— Сет Флауэрс

@SethFlowers: Спасибо за указатель, Сет. Тем временем связанная статья была отредактирована. Я посмотрю, смогу ли я вместо этого связать что-нибудь еще, или удалю ссылку. На данный момент вы абсолютно правы, здесь ответ не добавляет никакой ценности.
— Лукас Эдер

Спасибо - надеюсь, это не прозвучало грубо. Я только что увидел ссылку и подумал: «Да, это определенно то, что я хочу прочитать» - тогда меня немного подвело :).
— Сет Флауэрс

@SethFlowers: Не беспокойтесь. Я полностью согласен. Мне на помощь: за последние годы мои навыки ведения блога значительно улучшились :)
— Лукас Эдер

19

Даже со значением по умолчанию вы всегда можете переопределить данные столбца с помощью null.

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


Я думаю, это следует перефразировать: «Ограничение NOT NULL не позволит вам обновить эту строку после того, как она была создана с нулевым значением». Конечно, строки со столбцами NOT NULL могут быть обновлены, они просто не могут быть обновлены с помощью NULL как значение для этого столбца. Более того: я предполагаю, что создание строки означает вставку строки. Операторы INSERT также не могут иметь нулевые значения для столбцов, которые указаны с NOT NULL.
— makrom

4

Мой учитель SQL сказал, что если вы указываете и DEFAULTзначение, и NOT NULLили NULL, DEFAULTвсегда следует выражать до NOT NULLили NULL.

Как это:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NOT NULL

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NULL


5
Привет и спасибо за участие. Однако это не решает поставленный вопрос, и оба порядка полностью эффективны. Мне легче поставить значение по умолчанию в конце, когда я вручную пишу таблицы, потому что тогда значения NULL и NOT NULL лучше выравниваются.
— emragins

Ладно, думаю, ты тоже прав. Я не понимаю, почему в моем курсе прямо сказано то, что я написал в своем ответе. Я знаю, что мой ответ на самом деле не касается вопроса, но я обнаружил, что комментарий будет не очень читабельным.
— Танги Лабрадор Руис

3
Есть разница между (субъективными) лучшими практиками и правилами. Неплохая идея иметь единый стиль, но в этом конкретном случае я бы предпочел NOT NULL перед DEFAULT. Тем не менее, вы также можете писать комментарии вместо ответов, это было бы более уместно.
— makrom

Это, вероятно, не отвечает на вопрос. Но это именно то, что я искал. Спасибо.
— Саске Учиха

2

Я бы сказал, что нет.

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

Если не установлено значение NULL, вы не можете вставить значение NULL в поле, так как это вызовет ошибку.

Думайте об этом как об отказоустойчивом механизме предотвращения нулевых значений.


2
Вы сказали «создание нового правила». Вы хотели сказать «создание нового ряда»?
— bielawski

Я думаю, что это более практичный ответ на этот вопрос.
— Noman_ibrahim

@bielawski И почти 8 лет спустя я исправляю эту опечатку :)
— Dark Hippo

Это должен быть принятый ответ. OP задает простой вопрос, и ответ просто «нет». Однако для документации необходимы пояснения и примеры.
— Николас Хевиа,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.