Определение ограничений для таблицы
Объявление ограничений имеет в стандарте SQL92 следующее формальное описание:
table_constraint определяется как:
[ CONSTRAINT constraint_name ]
{ PRIMARY KEY (имя_поля .,:) }
| { UNIQUE (имя_поля .,:) }
| { FOREIGN KEY (имя_поля .,:) }
{ REFERENCES имя_таблицы [(имя_поля .,:)]
[ref_specification] }
| { CHECK (condition) }
[[ NOT ] DEFFERABLE ]
column_constraint определяется как:
[ CONSTRAINT constraint_name ]
{ NOT NULL } | { PRIMARY KEY } | UNIQUE
| { REFERENCES имя_таблицы [(имя_поля .,:) ]
[ref_specification]}
| { CHECK (condition) }
| [ INITIALLY DEFFERED | INITIALLY IMMEDIATE ]
[[ NOT ] DEFFERABLE ]
ref_specification определяется как:
[ MATCH {FULL | PARTIAL } ]
[ ON UPDATE
{ CASCADE | SET NULL | SET DEFAULT |
NO ACTION } ]
[ ON DELETE
{ CASCADE | SET NULL | SET DEFAULT |
NO ACTION } ]
Ссылочная спецификация (ref_specification) определяет для ограничений FOREIGN KEY и REFERENCES тип совпадения и действия, выполняемые при внесении изменений в родительский ключ. Совпадение может быть определено как MATCH FULL (полное совпадение) или MATCH PARTIAL (частичное совпадение).
При полном совпадении значения родительского и внешнего ключей должны полностью совпадать, или все значения внешнего ключа должны быть NULL.
При частичном совпадении некоторые значения внешнего ключа могут быть равны NULL и значения каждой строки внешнего ключа, отличные от NULL, должны совпадать со значениями родительского ключа.
Если тип совпадения не указан, то предполагается что любое значение внешнего ключа присутствует в родительском ключе, но при этом во внешнем ключе допускаются значения NULL (частично или полностью).
Рассмотрим таблицу tbl1, для которой определен родительский ключ как столбцы f1 и f2, и таблицу tbl2 с внешним ключом по столбцам c1 и c2. Если таблицы tbl1 tbl2 имеют следующие значения:
tbl1 | tbl2 | |||||
f1 | f2 | f3 | c0 | c1 | c2 | c3 |
1 | 11 | 100 | 1 | NULL | NULL | ff |
2 | 12 | 200 | 2 | 11 | NULL | gg |
3 | 13 | 300 | 3 | 11 | 100 | hh |
4 | 13 | 300 | 4 | NULL | 200 | ii |
то при указании фразы MATCH FULL ограничение ссылочной целостности допустит ввести во вторую таблицу только первую и третью строки (первая содержит в качестве значений внешнего ключа значение NULL, а третья- внешний ключ, полностью совпадающий с родительским). При указании фразы MATCH PARTIAL ограничение ссылочной целостности допустит ввести во вторую таблицу все указанные строки (первую строку - как допустимое несовпадающее значение, вторую и четвертую- как совпадающие с частичным значением NULL, третью- как уникально совпадающую).
Действия, выполняемые при внесении ограничений в родительский ключ, могут быть указаны фразами ON UPDATE и ON DELETE.
Фразы ON UPDATE и ON DELETE могут иметь одну из следующих опций:
-
CASCADE - распространение изменений, произведенных в родительском ключе, на совпадающие строки внешнего ключа (для MATCH PARTIAL - только на уникально совпадающие строки);
-
SET NULL - значения внешнего ключа изменяются на NULL по следующим правилам: для MATCH FULL - заменяются все значения внешнего ключа; для MATCH PARTIAL - в уникально совпадающих строках заменяются значения только тех столбцов, значения которых в родительском ключе были изменены; если тип совпадения не указан, то заменяются значения только тех столбцов, значения которых в родительском ключе были изменены;
-
SET DEFAULT - значения внешнего ключа изменяются на значение по умолчанию по тем же правилам, что и для фразы SET NULL, но при типе соответствия MATCH FULL заменяются значения только тех столбцов внешнего ключа, которые уникально соответствуют родительскому ключу (значение NULL внешнего ключа не заменяется).
NO ACTION - никаких действий во внешнем ключе не выполняется, допускаются только изменения родительского ключа, не нарушающие ссылочную целостность.
Фраза DEFFERABLE в ссылочной спецификации указывает отсроченную проверку ограничения до конца транзакции. Фраза NOT DEFFERABLE определяет, что контроль ссылочной целостности будет выполняться при каждом операторе INSERT, DELETE и UPDATE.
Режим проверки ограничения - сразу или с отсрочкой - устанавливается в начале каждого сеанса, а затем он может быть изменен SQL-оператором SET CONSTRAINTS MODE или локально фразами DEFFERABLE и NOT DEFFERABLE.
Использование языка SQL в MS Access
Язык SQL не обладает функциями полноценного языка разработки, а ориентирован на доступ к данным, поэтому его включают в состав средств разработки программ. В этом случае его называют встроенным SQL. Стандарт языка SQL поддерживают современные реализации следующих языков программирования: PL/1, Ada, С, COBOL, Fortran, MUMPS и Pascal.
В специализированных системах разработки приложений типа клиент-сервер среда программирования, кроме того, обычно дополнена коммуникационными средствами (установление и разъединение соединений с серверами БД, обнаружение и обработка возникающих в сети ошибок и т.д.), средствами разработки пользовательских интерфейсов, средствами проектирования и отладки.
Различают два основных метода использования встроенного SQL: статический и динамический.
При статическом использовании языка (статический SQL) в тексте программы имеются вызовы функций языка SQL, которые жестко включаются в выполняемый модуль после компиляции. Изменения в вызываемых функциях могут быть на уровне отдельных параметров вызовов с помощью переменных языка программирования.
При динамическом использовании языка (динамический SQL) предполагается динамическое построение вызовов SQL-функций и интерпретация этих вызовов, например, обращение к данным удаленной базы, в ходе выполнения программы. Динамический метод обычно применяется в случаях, когда в приложении заранее неизвестен вид SQL-вызова и он строится в диалоге с пользователем.
Основным назначением языка SQL (как и других языков для работы с базами данных) является подготовка и выполнение запросов. В результате выборки данных из одной или нескольких таблиц может быть получено множество записей, называемое представлением.
Представление по существу является таблицей, формируемой в результате выполнения запроса. Можно сказать, что оно является разновидностью хранимого запроса. По одним и тем же таблицам можно построить несколько представлений. Само представление описывается путем указания идентификатора представления и запроса, который должен быть выполнен для его получения.
Для удобства работы с представлениями в язык SQL введено понятие курсора. Курсор представляет собой своеобразный указатель, используемый для перемещения по наборам записей при их обработке.
Описание и использование курсора в языке SQL выполняется следующим образом. В описательной части программы выполняют связывание переменной типа курсор (CURSOR) с оператором SQL (обычно с оператором SELECT). В выполняемой части программы производится открытие курсора (OPEN <имя курсора», перемещение курсора по записям (FETCI-1 <имя курсора>...), сопровождаемое соответствующей обработкой, и, наконец, закрытие курсора (CLOSE <имя курсора>).
В реляционных СУБД для выполнения операций над отношениями используются две группы языков, имеющие в качестве своей математической основы теоретические языки запросов, предложенные Э. Коддом:
- реляционная алгебра;
- реляционное исчисление.
В реляционной алгебре операнды и результаты всех действий являются отношениями. Я зыки реляционной алгебры являются процедурными, так как отношение, являющееся результатом запроса к реляционной БД, вычисляется при выполнении последовательности реляционных операторов, применяемых к отношениям. Операторы состоят из операндов, в роли которых выступают отношения, и реляционных операций.
Операции реляционной алгебры Кодда можно разделить на две группы: базовые теоретико-множественные и специальные реляционные. Первая группа операций включает в себя классические операции теории множества: объединение, разность, пересечение и произведение. Вторая группа представляет собой развитие обычных теоретико-множественных операций в направлении к реальным задачам манипулирования данными, в ее состав входят операции: проекция, селекция, деление и соединение.
Языки исчислений являются непроцедурными (описательными или декларативными) и позволяют выражать запросы с помощью предиката первого порядка (высказывания в виде функции), которому должны удовлетворять кортежи или домены отношений. Запрос к БД, выполненный с использованием подобного языка, содержит лишь информацию о желаемом результате. Для этих языков характерно наличие наборов правил для записи запросов. В частности, к языкам этой группы относится SQL.
Особенности применения запросов SQL
Запросом SQL называют запрос, создаваемый с помощью инструкции SQL. Примерами запросов SQL являются запросы на объединение, запросы к серверу, управляющие и подчиненные запросы.
Запрос на объединение – такой запрос, в котором объединяются поля (столбцы) одной или нескольких таблиц или запросов в одно поле или столбец в результирующем наборе записей. Например, шесть продавцов каждый месяц представляют руководству описи имеющихся товаров. Создав запрос на объединение, можно объединить эти описи в результирующем наборе записей, а затем разработать запрос на создание таблицы, основанный на запросе на объединение.
Запрос к серверу выполняет передачу через ODBC команд SQL – серверу, например, Microsoft SQL Server. Запросы к серверу позволяют непосредственно работать с таблицами на сервере вместо их присоединения. Результатом выполнения запроса к серверу может быть загрузка записей или изменение данных.
Управляющий запрос создает или изменяет объекты базы данных, такие как таблицы Access или SQL Server.
Подчиненный запрос состоит из инструкции SQL SELECT, находящейся внутри другого запроса на выборку или запроса на изменение. Эти инструкции вводятся в строку «Поле» бланка запроса для определения нового поля или в строку «Условие отбора» для определения условия отбора поля. Подчиненные запросы используются для выполнения следующих действий:
- проверка в подчиненном запросе существования некоторых результатов с помощью зарезервированных слов EXISTS или NO EXISTS;
- поиск в главном запросе любых значений, которые равны, больше или меньше значений, возвращаемых в подчиненном запросе (с помощью зарезервированных слов ANY, IN или ALL);
- создание подчиненных запросов внутри подчиненных запросов (вложенных подчиненных запросов).
Язык SQL в Access может применяться при разработке экранных форм, отчетов, а также при создании макрокоманд и программ на VBA.