Вопрос по notnull, sql, default-value, ddl – Определение столбца SQL: значение по умолчанию, а не пустое значение?

57

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

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

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

Ваш Ответ

4   ответа
83

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);

Кроме того, вы также можете использоватьDEFAULT в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 все еще действительны заявления. Итак, чтобы ответить на ваш вопрос:

Нет,NOT NULL а такжеDEFAULT не являются лишними. Особенно,NOT NULL can have a tremendous impact on query performance as explained in this blog post here

12

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

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

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

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

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

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

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

Вы сказали «создание нового правила». Вы намеревались сказать «создание новой строки»?
2

Мой учитель 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

Ладно, думаю, ты тоже прав. Я не понимаю, почему в моем курсе четко сказано, что я написал в ответе. Я знаю, что мой ответ на самом деле не касается вопроса, но я обнаружил, что комментарий будет не очень читабельным.
Существует различие между (субъективной) лучшей практикой и правилами. Неплохая идея иметь последовательный стиль, но в этом конкретном случае я бы лично предпочел NOT NULL перед DEFAULT. Несмотря на это, вы также можете написать комментарии вместо ответов, это было бы более уместно.
Привет, и спасибо за участие. Это, однако, не решает рассматриваемый вопрос, и оба порядка полностью эффективны. Я считаю, что проще установить значение по умолчанию в конце, когда я вручную создаю сценарии для таблиц, потому что тогда значения NULL и NOT NULL лучше совпадают.

Похожие вопросы