Указание на первичные ключи
Внешние ключи могут указывать на первичные ключи других / собственных таблиц. Если он равен нулю (или частично равен нулю), то это означает, что у него нет строки, на которую есть ссылка.
Указание на уникальные ограничения
Внешние ключи также могут указать также на уникальные ограничения; и эти уникальные ограничения могут быть обнуляемыми. Посмотрите на приведенный ниже пример:
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
Как вы видите:
- Только полностью ненулевой внешний ключ ссылается на строку в другая таблица.
- Частично нулевая строка не ссылается на строку в другой таблице (хотя может быть частично проверена при некоторых обстоятельствах).
- Полностью нулевая строка не ссылается на строку в другой стол тоже. Даже если учесть, что есть уникальный ключ (нуль, ноль) .