Страница 2 из 8 Ссылочная целостность и РСУБД Синтаксис SQL для определения ссылочной целостности выглядит, по существу, подобно следующему. Слова из прописных буква обозначают ключевые слова. Квадратные скобки выделяют необязательные параметры. Столбцы внешнего ключа находятся в таблице table1, а столбцы первичного ключа (или другой комбинации столбцов со свойством уникальности значений) – в таблице table2. ALTER TABLE tableName1 ADD CONSTRAINT constraintName FOREIGN KEY (columnList) REFERENCES tableName2 [(columnList)] [onDeleteAction] [onUpdateAction]; В SQL внешний ключ может ссылаться на любую комбинацию столбцов со свойством уникальности в таблице, на которую ведет ссылка. В стандарте SQL [3] обеспечиваются следующие действия по поддержанию ссылочной целостности при удалениях строк. - Cascade. Удаление записи может привести к удалению записей с соответствующим значением внешнего ключа. Например, можно захотеть, чтобы при удалении записи о компании удалялись все адреса компании.
- No action. В качестве альтернативы можно запретить удаление записи, если имеются зависимые записи с соответствующим значением внешнего ключа. Например, если вы продали некоторой компании товары, то вы можете захотеть предотвратить удаление записи об этой компании.
- Set null. Удаление записи может приводить к установке в соответствующие внешние ключи неопределенного значения. Например, при замене самолета для выполнения рейса может понадобиться анулировать некоторые назначения посадочных мест. (Таким пассажирам придется запросить другие посадочные места.)
- Set default. Можно потребовать, чтобы при удалении записи во внешний ключ устанавливалось значение по умолчанию, а не неопределенное значение.
В стандарте SQL эти действия обеспечиваются и при модификации записей. Поддержка стандарта различается в разных продуктах. - SQL Server. В SQL Server 2000 внешний ключ может ссылаться на первичный ключ или на комбинацию столбцов со свойством уникальности. Не поддерживаются опции set null и set default. Однако опции cascade и no action поддерживаются полностью, и на практике этого часто оказывается достаточно. Заметим также, что синтаксис для no action отличается от стандарта SQL. В SQL Server при отсутствии явного указания ссылочного действия подразумевается no action.
- Oracle. В Oracle 10g внешний ключ также может ссылаться на первичный ключ или на комбинацию столбцов со свойством уникальности. В Oracle поддерживаются ссылочные действия при удалении записей, но отсутствуют действия при модификации. Для действий при удалении поддерживаются опции cascade, no action и set null. Поддержка опции set default отсутствует. Как и в SQL Server, синтаксис no action отличается от стандарта SQL. При отсутствии явного указания ссылочного действия подразумевается no action.
- MySQL. Поддержка ссылочной целостности появилась в MySQL 5.0 (при использовании InnoDB). В MySQL стандарт SQL поддерживается в более полном объеме, чем в SQL Server и Oracle. Поддерживаются варианты on delete и on update со всеми четырьмя ссылочными действия. В MySQL требуется, чтобы для внешнего ключа и ключа, на который ведет ссылка, поддерживались индексы базы данных – это хороший обычай, которому мы советуем следовать.* Столбцы, на которые ведет ссылка, могут быть первичным ключом или комбинацией столбцов со свойством уникальности.
- MS-Access. В MS-Access команды SQL для определения ссылочной целостности поддерживаются только частично, но средство графического связывания является более сильным. С помощью графического интерфейса можно определить ссылочную целостность, а также ссылочные действия cascade и no action.
|