Определение внешнего ключа таблицы
Спецификация

См. спецификацию пункта «Создание таблицы».

Синтаксические правила
  1. < Имена столбцов >, задействованные во < внешнем ключе > должны быть предварительно определены в конструкции < спецификация столбцов таблицы >.

    create or replace table tab
    (id   int primary key,
     name char(10),
     col1 int not null,
     col2 char(5) not null,
     col3 decimal not null,
    foreign key (col1, col2, col3) < ссылочная целостность >);
  2. Столбцы, составляющие внешний ключ, не могут иметь NULL-значение. Для каждой таблицы может быть только один внешний ключ.

  3. Нельзя создать два внешних ключа на один и тот же столбец (или с одинаковым набором столбцов).

  4. Внешний ключ (как простой, так и составной) может включать AUTOINC-столбцы.

  5. Если при задании < внешнего ключа > имя таблицы указывается без имени столбца (списка столбцов), то считается, что ссылка делается на первичный ключ дочерней таблицы.

Общие правила
  1. Ссылочная целостность – это согласованность данных между связанными таблицами БД. Она обеспечивается путем комбинирования первичного или уникального ключа и внешнего ключа.

  2. Первичный ключ – это столбец или группа столбцов, однозначно определяющие запись таблицы. Первичный ключ уникален: в таблице не может быть двух разных записей с одинаковыми значениями первичного ключа.

  3. Уникальный ключ – аналог первичного ключа. Отличие в том, что столбцы уникального ключа могут иметь NULL-значение.

  4. Внешний ключ – это столбец или группа столбцов, ссылающиеся на столбец или группу столбцов другой (или этой же) таблицы. Значения внешнего ключа могут дублироваться. Т.е. внешний ключ обеспечивает соответствие значений полей одной записи родительской таблицы множеству значений полей записей дочерних таблиц.

  5. Между двумя или более таблицами БД могут существовать отношения подчиненности, которые определяют, что для каждой записи главной (родительской) таблицы может существовать одна или несколько записей в подчиненной (дочерней) таблице.

  6. Таблица, на которую ссылается внешний ключ, называется родительской таблицей, а столбцы, на которые ссылается внешний ключ – первичным (родительским) ключом. Сам внешний ключ создается в дочерней таблице.

  7. Таблица, в которой задается ограничение внешнего ключа (опция REFERENCES), называется дочерней таблицей, а столбцы, на которые ссылается внешний ключ – первичным (родительским) ключом.

  8. Для соблюдения ссылочной целостности требуется, чтобы любое значение внешнего ключа дочерней таблицы могло содержать только значения из первичного или уникального ключа родительской таблицы.

  9. Внешние ключи могут создавать:

    • пользователи – владельцы родительской и дочерней таблиц;

    • пользователи с полномочиями ALTER для дочерней и REFERENCES для родительской таблиц;

    • создатель БД и пользователи с привилегией администратора БД (DBA).

  10. Столбец строкового типа во внешнем ключе может ссылаться на столбец того же типа, но другой длины.

    drop table tfk;
    drop table tpk cascade;
    
    create or replace table tpk(c1 char(3), c char(10) primary key, c2 char(3));
    create or replace table tfk(c1 char(3), c char(20) references tpk on update cascade, c2 char(3));
    insert into tpk values ('111','AAA','222');
    insert into tpk values ('abc','AAAAAA','xyz');
    insert into tfk values ('111','AAA','222');
    insert into tfk values ('111','AAAAAA','222');
    select * from tpk;
    select * from tfk;
    update tpk set c='AAAAAA';
    select * from tpk;
    select * from tfk;
    
    create or replace table tpk(c1 char(3), c char(10) primary key, c2 char(3));
    create or replace table tfk(c1 char(3), c char(20) references tpk on update cascade, c2 char(3));
  11. Столбец типа DECIMAL во внешнем ключе может ссылаться на столбец того же типа, но с другими значениями масштаба и точности.