Определение столбца 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 задает простой вопрос, и ответ просто «нет». Однако для документации необходимы пояснения и примеры.
Николас Хевиа,