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

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

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

вопрос: поскольку указано значение по умолчанию, необходимо также указать, что столбец не должен принимать нули ? Другими словами, не делает ли DEFAULT 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.

на NOT NULL ограничение не позволит вам обновить эту строку после ее создания с помощью null стоимостью


мой учитель 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


Я бы так не сказал.

Если столбец не может принимать значение NULL, то ничто не мешает вам вставить значение null в поле, насколько я знаю, по умолчанию применяется только при создании нового правила.

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

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