Разработка приложений баз данных для СУБД Sybase SQL Anywhere

       

Определение внешних ключей


Внешние ключи используются для организации связей между таблицами базы данных (родительскими и дочерними) и для поддержания ограничений ссылочной целостности данных. В СУБД SYBASE SQL Anywhere ссылочная целостность проверяется при:

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

    Для проверки действия механизма внешних ключей перепишем содержимое таблиц Books и Copies в одноименные таблицы базы данных Dubl_Biblia. Такая возможность довольно просто реализуется в утилите ISQL. Для решения поставленной задачи необходимо в среде этой утилиты установить соединение с и произвести экспорт содержимого таблиц в текстовые файлы. Это могут сделать владельцы таблиц, пользователи, имеющие привилегию SELECT () для этих таблиц, и администратор базы данных.

    Экспорт в данном случае реализуется следующими операторами:

    /* Экспорт в текстовые файлы каталога C:\temp содержимого таблиц Books и Copies */ UNLOAD TABLE Stepanov.Books TO 'c:\temp\books.txt'; UNLOAD TABLE Stepanov.Copies TO 'c:\temp\copies.txt'

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

    /* Импорт из текстовых файлов содержимого таблиц Books и Copies */ LOAD TABLE Stepanov.Copies FROM 'c:\temp\copies.txt'; LOAD TABLE Stepanov.Books FROM 'c:\temp\books.txt'

    Выполнять операторы LOAD имеют право владельцы таблиц, пользователи, имеющие привилегию INSERT () для этих таблиц, и администратор базы данных.

    Для проверки результатов копирования достаточно просмотреть содержимое таблиц при помощи оператора SELECT ().

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

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



  • В утилите SQL Central внешние ключи создаются мастером Add Foreign Key. Для доступа к нему следует последовательно раскрыть папки Tables - <имя таблицы> - Foreign Keys. Мастер Add Foreign Key выполняет ряд шагов, которые мы рассмотрим по устоявшейся схеме (п.5.1). Работу мастера покажем на примере создания внешнего ключа таблицы Copies, который ссылается на таблицу Books.

    Шаг 1. Начальная стадия создания внешнего ключа таблицы данных (рис. 63).



    Рис. 63. Создание внешнего ключа таблицы данных



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

    Внешние ключи, создаваемые пользователями СУБД SQL Anywhere, обеспечивают поддержание ссылочной целостности баз данных.

    Дочерняя таблица: Copies.

    Вопрос. На какую таблицу будет ссылаться создаваемый внешний ключ?

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

    После выбора родительской таблицы следует щелкнуть по кнопке Далее для выполнения следующего шага.

    Шаг 2. Выбор полей родительской таблицы, на которые будет ссылаться внешний ключ дочерней таблицы данных (рис. 64).



    Рис. 64. Выбор полей родительской таблицы, на которые будет ссылаться внешний ключ дочерней таблицы данных

    Вопрос 1. Создаваемый внешний ключ будет указывать на первичный ключ или совокупность полей с признаком уникальности?

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

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

    Вопрос 2. Какие поля внешнего ключа будут соответствовать полям первичного ключа родительской таблицы?

    Далее приводится таблица соответствия полей. SQL Anywhere пытается сама установить соответствие по совпадению имен и типов полей. В тех случаях, где она затрудняется это сделать предлагается список для осуществления выбора. В нашем случае соответствие установлено правильно.

    Если предлагаемое соответствие вас устраивает, то переходим к очередному шагу.

    Шаг 3. Определение названия и комментария к внешнему ключу (рис. 65).





    Рис. 65. Определение названия и комментария к внешнему ключу

    Вопрос. Какое название будет иметь новый внешний ключ?

    Следующее ниже поле окна представляет собой средство для ответа на поставленный вопрос. Назовем внешний ключ Books_Copies.

    Пояснение. Вы можете включить комментарий для нового внешнего ключа.

    Ниже располагается поле для ввода комментария для создаваемого внешнего ключа.

    Произведя все манипуляции, приступаем к следующему шагу.

    Шаг 4. Задание атрибутов внешнего ключа (рис. 66).



    Рис. 66. Задание атрибутов внешнего ключа

    Пояснение 1. SQL Anywhere позволяет внешнему ключу содержать значения NULL.

    Вопрос 1. Желаете ли вы разрешить хранение значений NULL в полях, составляющих внешний ключ?

    Для ответа на этот вопрос предназначен флажок Allows NULLS. В тех случаях, когда это недопустимо, например как в нашем, ниже в области Note приводится комментарий по этому поводу.

    Комментарий. Ни одно из полей, составляющих внешний ключ, не допускают хранение значений NULL.

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

    Вопрос 2. Желаете ли вы производить проверку целостности только при выполнении оператора COMMIT?

    Флажок Check on COMMIT позволяет ответить на этот вопрос.

    Оператор COMMIT осуществляет завершение текущей и начало следующей транзакций. В некоторых случаях необходимо при выполнения последовательности SQL-операторов, изменяющих сразу несколько таблиц, выполнять проверку целостности только при завершении транзакций. SQL Anywhere предоставляет такую возможность и именно этим вызван вопрос 2.

    В нашем случае нет необходимости откладывать проверку ограничений целостности и поэтому оставим флажок Check on COMMIT в сброшенном состоянии.

    После выполнения действий, предписанных в шаге 4, переходим шагу 5.

    Шаг 5. Определение условий ссылочной целостности (рис. 67).





    Рис. 67. Определение условий ссылочной целостности

    Вопрос 1. Какие действия должны предприниматься для поддержания ссылочной целостности?

    Для ответа на этот вопрос используются переключатели Update Action и Delete Action. Первый из них, Update Action, определяет действие, выполняемое при модификации значений полей родительской таблицы, на которые ссылаются поля внешнего ключа дочерней таблицы. Назовем эти поля родительской таблицы адресуемыми полями. Второй переключатель Delete Action предназначен для выбора действия, выполняемого при удалении записей родительской таблицы.

    Положения переключателя Update Action. регламентируют выполнение следующих действий при модификации адресуемых полей родительской таблицы:

  • Restrict Update - запрещение модификацию адресуемых полей;
  • Cascade - (каскадное обновление) изменение значений полей внешнего ключа в записях, ссылающихся на модифицируемую запись родительской таблицы, на новое значение адресуемых полей;
  • Set NULL- изменение значений полей внешнего ключа в записях, ссылающихся на модифицируемую запись родительской таблицы, на значение NULL;
  • Set Default - изменение значений полей внешнего ключа в записях, ссылающихся на модифицируемую запись родительской таблицы, на значение присваиваемое полю по умолчанию.


  • Для указания действий, которые надлежит выполнить при удалении записей родительской таблицы используется переключатель Delete Action. Он следующие положения:

  • Restrict Delete- запрещение удаления;
  • Cascade - (каскадное удаление) удаление записей дочерней таблицы, ссылающихся на удаляемую запись родительской таблицы;
  • Set NULL- изменение значений полей внешнего ключа в записях, ссылающихся на удаляемую запись родительской таблицы, на значение NULL;
  • Set Default - изменение значений полей внешнего ключа в записях, ссылающихся на удаляемую запись родительской таблицы, на значение присваиваемое полю по умолчанию.


  • Как показано на рис. 67 для создаваемого внешнего ключа определено каскадное обновление полей внешнего ключа дочерней таблицы (поле Copies.Code_book) при изменение адресуемых полей родительской таблицы (поле Books.Code_book) - (Update Action/ Cascade) и запрещение удаления записей родительской таблицы Books, на которую имеются ссылки из дочерей таблицы Copies. (Delete Action / Restrict Delete).

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

    Шаг 6. Подтверждение готовности к созданию нового внешнего ключа (рис. 68).



    Рис. 68. Подтверждение готовности к созданию нового внешнего ключа




      Содержание раздела