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