Jet / Access DDL: Как создать ограничения FOREIGN KEY без проверки целостности данных? - PullRequest
2 голосов
/ 09 ноября 2010

Когда вы создаете ограничения внешнего ключа с помощью Access (с помощью редактора схемы базы данных), у вас есть возможность включить или отключить следующие параметры (реальные подписи могут отличаться, у меня доступна только локализованная версия Access):

x Enforce data integrity
  x Cascade updates
  x Cascade deletions

В DDL последние два могут быть представлены с помощью:

ADD CONSTRAINT Constraint1
  FOREIGN KEY (Field1)
  REFERENCES Table2 (Table2Field1)
  ON UPDATE CASCADE
  ON DELETE CASCADE

Но как вы смоделируете случай, когда ни один из флажков не установлен, даже "принудительная целостность"?

Простое удаление предложений «ON UPDATE / ON DELETE» по-прежнему создает эквивалент ограничения «принудительной целостности» (и, следовательно, требует, чтобы у Field1 и Table2Field1 были индексы).

Ответы [ 3 ]

1 голос
/ 09 ноября 2010

Я думаю, вы путаете «Отношения» Access с ACE / Jet FOREIGN KEY.

Как правило, вы не можете использовать SQL DDL для создания объектов Access (даже если эти объекты сохраняются в таблицах ACE / Jet). Другой пример - Правила валидации, но вы можете создать ограничения CHECK, используя SQL DDL (фактически, не может быть создан каким-либо иным способом), которые являются более мощными (например, могут быть более одной на таблицу, могут ссылаться на другие строки в той же таблице или другие таблицы и т. д.), но правила проверки отображаются в схеме adSchemaTableConstraints VIEW с CONSTRAINT_TYPE = 'CHECK'.

0 голосов
/ 09 ноября 2010

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

http://msdn.microsoft.com/en-us/library/ms177463.aspx

0 голосов
/ 09 ноября 2010

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

Я полагаю, что в некоторых базах данных (например, в Oracle) вы могли бы создать ограничение, но оставить его отключенным - но это кажется бессмысленным, за исключением документального преимущества. Ограничения AFAIK нельзя отключить в Access, но я могу ошибаться.

Делись и наслаждайся.

...