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