Визначення стовпця SQL: значення за замовчуванням і не є нульовим зайвим?


86

Я багато разів бачив наступний синтаксис, який визначає стовпець у операторі DDL create / alter:

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

Питання в тому: оскільки вказано значення за замовчуванням, чи потрібно також вказувати, що стовпець не повинен приймати NULL? Іншими словами, чи не DEFAULT робить NOT NULL зайвим?

Відповіді:


126

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вони все ще є дійсними. Тож, щоб відповісти на ваше запитання: Ні, вони не зайві.


Я перейшов до вашого посилання (до вашого допису в блозі), розраховуючи побачити пояснення (можливо, з деякими цифрами) надзвичайного впливу на ефективність запиту, але побачив, як воно ненадовго підтвердило, що воно впливає. Не ображайте, але посилання трохи вводить в оману.
Сет Флауерс

@SethFlowers: Дякую за вказівник, Сет. Пов’язана стаття тим часом була відредагована. Я подивлюсь, чи можу я замість цього зв’язати щось інше, або видалити посилання. Як і зараз, ви абсолютно праві, це не додає жодної цінності відповіді тут.
Лукас Едер,

Дякую - сподіваюся, я не здався грубим. Я просто побачив посилання і сказав: "так, це точно те, що я хочу прочитати" - тоді мене трохи підвели :).
Сет Флауерс

@SethFlowers: Не хвилюйся. Я цілком згоден. На мій порятунок: Мої навички ведення блогу значно покращились за останні роки :)
Лукас Едер,

19

Навіть зі значенням за замовчуванням, ви завжди можете замінити дані стовпця за допомогою null.

NOT NULLОбмеження не дозволить вам оновити цей рядок після того, як вона була створена з nullзначенням


Я думаю, це слід переформулювати: "Обмеження NOT NULL не дозволить вам оновити цей рядок після його створення з нульовим значенням" Звичайно, рядки з колонками NOT NULL можуть бути оновлені, вони просто не можуть бути оновлені з null як значення для цього стовпця. Крім того: я припускаю, що створення рядка означає вставлення рядка. Оператори INSERT не можуть мати нульові значення для стовпців, які також вказані з NOT NULL.
макром

4

Мій вчитель 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


5
Привіт, дякую за участь. Однак це не стосується актуального питання, і обидва замовлення цілком ефективні. Мені простіше поставити за замовчуванням в кінці, коли я вручну створюю сценарії таблиць, тому що тоді значення NULL і NOT NULL вирівнюються краще.
emragins

Гаразд, мабуть, ти теж маєш рацію. Я не розумію, чому мій курс чітко говорить про те, що я написав у своїй відповіді. Я знаю, що моя відповідь насправді не стосується питання, але я виявив, що коментар буде не дуже читабельним.
Tanguy Labrador Ruiz

3
Існує різниця між (суб’єктивною) найкращою практикою та правилами. Це не погана ідея мати послідовний стиль, але в цьому конкретному випадку я особисто віддав би перевагу NOT NULL перед DEFAULT. Незалежно від того, замість відповідей ви також можете писати коментарі, це було б доречніше.
макром

Це, мабуть, не відповідає на питання. Але це саме те, що я шукав. Дякую.
Саске Учіха

2

Я б сказав, що ні.

Якщо стовпець приймає нульові значення, тоді ніщо не заважає вставити нульове значення в поле. Наскільки мені відомо, значення за замовчуванням застосовується лише при створенні нового рядка.

Якщо не встановлено значення null, ви не можете вставити значення null у поле, оскільки воно спричинить помилку.

Подумайте про це як про захисний механізм запобігання нулю.


2
Ви сказали "створення нового правила". Ви мали намір сказати "створення нового рядка"?
bielawski

Я думаю, що це більш практична відповідь на це питання.
Noman_ibrahim

@bielawski І майже через 8 років я намагаюся виправити цю помилку :)
Темний бегемот

Це має бути прийнятою відповіддю. OP задає просте запитання, а відповідь просто «ні». Пояснення та приклад потрібні для документації.
Ніколас Гевія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.