Подтвердить что ты не робот

Определение столбца SQL: значение по умолчанию, а не null избыточное?

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

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

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

4b9b3361

Ответ 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, то вам нечего помещать в поле нулевое значение, насколько мне известно, значение по умолчанию применяется только при создании нового правила.

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

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