Определение столбца SQL: значение по умолчанию и не пустое избыточное?
Я много раз видел следующий синтаксис, который определяет столбец в инструкции create / alter DDL:
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
вопрос: поскольку указано значение по умолчанию, необходимо ли также указать, что столбец не должен принимать значения null ? Другими словами, не делает ли значение по умолчанию NOT NULL избыточным ?
4 ответа:
DEFAULT- это значение, которое будет вставлено при отсутствии явного значения в инструкции insert / update. Предположим, ваш 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может иметь огромное влияние на производительность запросов, как описано в этом блоге здесь
даже при значении по умолчанию вы всегда можете переопределить данные столбца с помощью
null.The
NOT NULLограничение не позволит вам обновить эту строку после ее создания с помощьюnullстоимостью
мой учитель SQL сказал, что если вы укажете оба a
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
Я бы так не сказал.
Если столбец не может принимать значение NULL, то ничто не мешает вам вставить значение null в поле, насколько я знаю, по умолчанию применяется только при создании нового правила.
с not null set, то вы не можете вставить нулевое значение в поле, как это будет выдавать ошибку.
думайте об этом как о безотказном механизме для предотвращения нулей.