Определение столбца 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, то вы не можете вставить нулевое значение в поле, как это будет выдавать ошибку.
думайте об этом как о безотказном механизме для предотвращения нулей.