PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Защо мога да създам таблица с PRIMARY KEY в колона с нула?

Тъй като 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 се третира като шумна дума в този контекст.
И не бихме искали последното да се провали. Така че това не е опция.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да изброите всички бази данни с помощта на PostgreSQL

  2. Вземете дърво родители + деца с pg-promise

  3. Изберете Номер на ред в postgres

  4. Преобразувайте шестнадесетичен в текстово представяне в десетично число

  5. Генерирайте произволно число в диапазона 1 - 10