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


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

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

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

4 51

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

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