Если внешний ключ является первичным ключом другой таблицы, почему он может быть нулевым? - PullRequest
0 голосов
/ 27 апреля 2020

Первичный ключ не может быть нулевым, это правило. Но почему внешний ключ может? Если это также первичный ключ другой таблицы.

Это потому, что он не из основной таблицы?

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Указание на первичные ключи

Внешние ключи могут указывать на первичные ключи других / собственных таблиц. Если он равен нулю (или частично равен нулю), то это означает, что у него нет строки, на которую есть ссылка.

Указание на уникальные ограничения

Внешние ключи также могут указать также на уникальные ограничения; и эти уникальные ограничения могут быть обнуляемыми. Посмотрите на приведенный ниже пример:

create table person (
  id int primary key not null,
  first_name varchar(20),
  last_name varchar(20),
  constraint uq1 unique (first_name, last_name)
);

insert into person (id, first_name, last_name) values (1, 'Peter', 'Cantropus');
insert into person (id, first_name, last_name) values (2, 'Chad', 'Ensis');
insert into person (id, first_name, last_name) values (3, null, null);

create table car (
  brand varchar(30),
  owner_first_name varchar(20),
  owner_last_name varchar(20),
  constraint fkoc1 foreign key (owner_first_name, owner_last_name)
    references person(first_name, last_name)
);

insert into car (brand, owner_first_name, owner_last_name) values
  ('Renault', 'Peter', 'Cantropus');
insert into car (brand, owner_first_name, owner_last_name) values
  ('Lada', null, null);
insert into car (brand, owner_first_name, owner_last_name) values
  ('Sumi', 'Chad', null);

select * from car;

Результат:

id  first_name  last_name
--  ----------  ---------
 1  Peter       Cantropus
 2  Chad        Ensis    
 3  <null>      <null>   

brand    owner_first_name  owner_last_name
-------  ----------------  ---------------
Renault  Peter             Cantropus       -- not null: has a referenced row
Lada     <null>            <null>          -- null: not referencing
Sumi     Chad              <null>          -- partially null: not referencing

Как вы видите:

  • Только полностью ненулевой внешний ключ ссылается на строку в другая таблица.
  • Частично нулевая строка не ссылается на строку в другой таблице (хотя может быть частично проверена при некоторых обстоятельствах).
  • Полностью нулевая строка не ссылается на строку в другой стол тоже. Даже если учесть, что есть уникальный ключ (нуль, ноль) .
0 голосов
/ 27 апреля 2020

Обнуляемость внешних ключей определяется ограничением NULL. То есть внешние ключи могут быть NULL, что указывает на отсутствие связи.

Конечно, primary key s никогда не может быть NULL, поэтому нет никакой опасности, что значение NULL будет перепутано с матч.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...