Interested Article - Ссылочная целостность

Ссы́лочная це́лостность ( англ. referential integrity ) — корректность значений внешних ключей реляционной базы данных .

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

Определение

Связи между данными, хранимыми в разных отношениях, в реляционной БД устанавливаются с помощью использования внешних ключей — для установления связи между кортежем из отношения A с определённым кортежем отношения B в предусмотренные для этого атрибуты кортежа отношения A записывается значение первичного ключа (а в общем случае значение потенциального ключа ) целевого кортежа отношения B . Таким образом, всегда имеется возможность выполнить две операции:

  • определить, с каким кортежем в отношении B связан определённый кортеж отношения A ;
  • найти все кортежи отношения A , имеющие связи с определённым кортежем отношения B .

Благодаря наличию связей в реляционной БД можно хранить факты без избыточного дублирования, то есть в нормализованном виде. Ссылочная целостность может быть проиллюстрирована следующим образом:

Дана пара отношений A и B , связанных внешним ключом. Первичный ключ отношения B — атрибут B.key . Внешний ключ отношения A , ссылающийся на B — атрибут A.b . Ссылочная целостность для пары отношений A и B имеет место тогда, когда выполняется условие: для каждого кортежа отношения A существует соответствующий кортеж отношения B , то есть кортеж, у которого ( B.key = A.b ).

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

Если вышеприведённое условие не выполняется, говорят, что в базе данных нарушена ссылочная целостность . Такая БД не может нормально эксплуатироваться, так как в ней разорваны логические связи между зависимыми друг от друга фактами. Непосредственным результатом нарушения ссылочной целостности становится то, что корректным запросом не всегда удаётся получить корректный результат.

Поддержание ссылочной целостности в БД

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

  • При операции добавления записи автоматически проверяется, ссылаются ли внешние ключи в этой записи на существующие записи в заявленных при описании связанных таблицах. Если выясняется, что операция приведёт к появлению некорректных ссылок, она не выполняется — система возвращает ошибку.
  • При операции редактирования записи проверяется:
    • если изменяется её первичный ключ и на данную запись имеются ссылки, то операция редактирования завершается с ошибкой;
    • если изменяется какой-то из внешних ключей , хранящихся в этой записи, и после изменения внешний ключ будет ссылаться на несуществующую запись, то операция редактирования завершается с ошибкой.
  • При операции удаления записи проверяется, нет ли на неё ссылок. Если ссылки имеются, то возможно три варианта дальнейших действий (фактически выполняемый зависит от СУБД и от выбора программиста, который он должен сделать при описании связи):
    • Запрет — удаление блокируется и возвращается ошибка.
    • Каскадное удаление — в одной транзакции производится удаление данной записи и всех записей, ссылающихся на данную. Если на удаляемые записи также есть ссылки и настройки также требуют удаления, то каскадное удаление продолжается дальше. Таким образом, после удаления данной записи в базе не остаётся ни одной записи, прямо или косвенно ссылающейся на неё. Если хотя бы одну из ссылающихся записей удалить не получается (либо для неё настроен запрет, либо происходит какая-либо другая ошибка), то все удаления запрещаются.
    • Присвоение NULL — во все внешние ключи записей, ссылающихся на данную, записывается маркер NULL . Если хотя бы для одной из ссылающихся записей это невозможно (например, если поле внешнего ключа описано как NOT NULL), то удаление запрещается.
Источник —

Same as Ссылочная целостность