Тъй като PRIMARY KEY
прави включената(ите) колона(и) NOT NULL
автоматично . Цитирам ръководството тук:
Ограничението на първичния ключ указва, че колона или колони на atable могат да съдържат само уникални (недублирани), ненулеви стойности. Технически,
PRIMARY KEY
е просто комбинация отUNIQUE
иNOT NULL
.
Удебелен акцент мой.
Проведох тест, за да потвърдя, че NOT NULL
е напълно излишен в комбинация с PRIMARY KEY
ограничение (в текущата реализация, повторно тествана във версия 13). NOT NULL
ограничаване оставато дори след отпадане на ограничението PK, независимо от изричното NOT NULL
клауза в момента на създаване.
CREATE TABLE foo (foo_id int PRIMARY KEY);
ALTER TABLE foo DROP CONSTRAINT foo_pkey;
db=# \d foo
table »public.foo«
column | type | attribute
--------+---------+-----------
foo_id | integer | not null -- stays
db<>цигулка тук
Идентично поведение, ако NULL
е включен в CREATE TABLE
изявление.
Все пак няма да навреди да запазите NOT NULL
излишно в хранилища за код, ако колоната трябва да е NOT NULL
. Ако по-късно решите да промените PK ограничението, може да забравите да маркирате колоната NOT NULL
- или дори е трябвало да е NOT NULL
.
В уикито Postgres TODO има елемент за разделяне на NOT NULL
от ограничението PK. Така че това може да се промени в бъдещи версии:
Преместете информацията за ограничение NOT NULL в pg_constraint
Понастоящем ограниченията NOT NULL се съхраняват в pg_attribute без никакво обозначение на техния произход, напр. първични ключове. Един манифест проблем е, че премахването на ограничение PRIMARY KEY не премахва обозначението на ограничението NOT NULL. Друг проблем е, че вероятно трябва да принудим NOT NULL да се разпространява от родителски таблици към деца, точно както са ограниченията CHECK. (Но тогава изпускането на PRIMARY KEY засяга ли децата?)
Отговор на добавен въпрос
Няма ли да е по-добре тази противоречива CREATE TABLE да се провали точно там?
Както беше обяснено по-горе, това
foo_id INTEGER NULL PRIMARY KEY
е (в момента) 100 % еквивалентен на:
foo_id INTEGER PRIMARY KEY
Тъй като NULL
се третира като шумна дума в този контекст.
И не бихме искали последното да се провали. Така че това не е опция.