Ограничения базы данных
Лучший способ применить ограничение базы данных (ограничение, охватывающее два или более отношений - из которых ограничение ссылочной целостности - это частный случай с синтаксической сокращенной записью, foreign key
/ references
операторов) будет декларативно с помощью стандартного оператора SQL:
create assertion <name> check (<condition>)
В вашем случае что-то вроде:
create assertion Child_DATE_between_MIN_MAX check (
not exists (
select DATE_MIN, DATE, DATE_MAX
from Parent, Child
where ID = PARENT_ID
and DATE < DATE_MIN
and DATE > DATE_MAX
)
)
ОБНОВЛЕНИЕ: Я забыл, что <condition>
является строго логическим значением, поэтому старый код был неправильным.
К сожалению (умеренный сарказм здесь) большинство SQL-СУБД не реализуют ASSERTIONs.
Таким образом, остается реализовать эту проверку процедурно , с хранимыми процедурами и триггерами или проверочными ограничениями, если они доступны. В этом случае необходимо вызывать одни и те же хранимые процедуры для обновления как родительских, так и дочерних отношений; поэтому одна процедура и два триггера или проверка ограничений.
Ответ Люркера В самом деле показывает такое решение, но для него требуется аналогичная проверка на дочерние отношения.
Озабоченность выступлениями
Damien_The_Unbeliever, в комментарии к тот же ответ , утверждает:
1) Возможно, вы несете полный
сканирование таблицы для каждой вставки / обновления
Здесь я остановлюсь на этом возражении, потому что оно очень распространено и может показаться действительным даже для ОБОБЩЕНИЙ (вероятно, это распространенное заблуждение, которое убеждает пользователей не спрашивать о них разработчиков SQL-СУБД, даже если они это в стандарте).
Ну да, он прав ... если кто-то использует СУБД, которая отстой!
Существует интересная часть теории, которую можно применить к поддержанию целостности: Дифференциальное реляционное исчисление (доступно как .pdf здесь ; вы также найти адекватную трактовку предмета в каждой достойной книге о теории БД).
Основная идея заключается в том, что можно применять ограничения целостности, часто проверяя только подмножества отношений, связанных с обновлением. Более строго, цитируя реферат связанной статьи:
... Формальное дифференцирование первого порядка
предложения полезны в поддержании
целостность базы данных, так как раз
ограничение базы данных выражается как
предложение первого порядка, его производная
в отношении сделки обеспечивает
необходимое и достаточное условие
для поддержания целостности. The
производная часто намного проще
тест, чем исходное ограничение
так как он поддерживает целостность
дифференциально, предполагая целостность
до сделки и тестирования
только за новые нарушения . ...
Существуют и другие методы работы с поддержанием добавочных ограничений целостности . У разработчиков СУБД нет веских причин игнорировать такую теорию. Фактически, авторы Введение любителя в ограничения целостности и проверку целостности в SQL ( .pdf ) написали во введении:
1 Введение
... Коммерческие продукты реляционных СУБД
однако поддерживает SQL (например, например,
Oracle [Ora99] или DB2 [IBM99]) не
поддерживать более продвинутые формы
ограничений. Даже сегодня более 8
лет после того, как стандарт SQL'92 имеет
было выдано, ни один из этих коммерческих
Система поддерживает утверждения , наиболее
общая форма ограничения в SQL!
Научная литература , т.е. исследования
документы, посвященные целостности на
С другой стороны, обеспечить богатство
многообещающие результаты, применимые к очень
общие и мощные формы
ограничения целостности . ...
Итак, пожалуйста: попросите вашего поставщика СУБД SQL (коммерческой или бесплатной / с открытым исходным кодом) внедрить ПОЛОЖЕНИЯ сейчас и, по крайней мере, с разумной производительностью.