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

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

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

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

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

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