Ограничения целостности при манипулировании данными

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

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

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

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

· Запрет выполнения операции, что приводит к возникновению ошибки и невыполнению операции.

· Установка неопределённых значений, что приводит к установке неопределённых значений внешних ключей строк дочерней таблицы, ссылавшихся на модифицированную или удаленную строку.

· Каскадирование операции, что приводит в случае удаления строки в родительской таблице к удалению всех ссылающихся на неё строк дочерней таблицы и к изменению значения внешнего ключа всех связанных строк дочерней таблицы при изменении первичного ключа строки родительской таблицы. Таким образом, одна операция удаления или изменения может повлечь за собой каскадное выполнение операций в нескольких таблицах, причем при иерархической связи таблиц могут быть удалены все данные. Однако, все эти операции рассматриваются как единое целое, и если хотя бы в одной из них возникает ошибка, то все операции считаются невыполненными. Это тесно связано с понятием транзакции, широко описанным в литературе[4, 11].

Пример создания базы данных

Рассмотрим пример создания структуры разработанной нами ранее базы данных по учету билетов на рейсы пассажирских авиалиний в системе управления базами данных MS SQL Server.

Структуру будем создавать согласно даталогической схеме, приведенной на рис. 8, и в нее войдут следующие типы объектов базы данных:

· таблицы;

· поля таблицы;

· первичные ключи;

· внешние ключи.

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

Каждая таблица базы данных участвует, как минимум, в одной связи. В рассматриваемой нами схеме таблица «Авиабилеты» участвует в двух связях, и в них обеих она выступает в роли дочерней таблицы. Поэтому таблицы «Пассажиры» и «Рейсы» должны быть созданы ранее таблицы «Авиабилеты». Таблица «Рейсы» участвует в трех связях, в двух из которых выступает в роли дочерней таблицы. Поэтому таблицы «Марки» и «Пункты» должны быть созданы ранее таблицы «Рейсы».

Создадим таблицу «Пассажиры»:

CREATE TABLE "Пассажиры" (

"№Пассажира" INT PRIMARY KEY,

"ФИО" VARCHAR(100) NOT NULL,

"Паспортные_данные" VARCHAR(100) NOT NULL,

"Скидка" INT);

Создадим таблицу «Пункты»:

CREATE TABLE "Пункты" (

"№Пункта" INT PRIMARY KEY,

"Пункт_прибытия " VARCHAR(100) NOT NULL);

Создадим таблицу «Марки»:

CREATE TABLE "Марки" (

"№Марки" INT PRIMARY KEY,

"Марка_самолета" VARCHAR(100) NOT NULL,

"кол-во_мест" int);

Создадим таблицу «Рейсы»:

CREATE TABLE "Рейсы" (

"№Рейса" INT PRIMARY KEY,

"№Марки" INT FOREIGN KEY REFERENCES "Марки"("№Марки"),

"Время_вылета" DATETIME NOT NULL,

"Цена_билета" DECIMAL(8,2) NULL,

"№Пункта" INT FOREIGN KEY REFERENCES "Пункты" ("№Пункта"));

Создадим таблицу «Авиабилеты»:

CREATE TABLE "Авиабилеты" (

"№Рейса" INT FOREIGN KEY REFERENCES "Рейсы" ("№Рейса"),

"Дата_вылета" DATETIME,

"№Пассажира" INT FOREIGN KEY REFERENCES "Пассажиры" ("№Пассажира"),

PRIMARY KEY ("№Рейса", "Дата_вылета", "№Пассажира") );

Первичный ключ таблицы «Авиабилеты» является составным, поэтому он создается как ограничение таблицы, все остальные ключи являются простыми и создаются как ограничения поля.

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

Заполним таблицу «Пассажиры»:

INSERT INTO "Пассажиры" VALUES (1, 'Петров А.А. ', '3000 № 1234567', 5);

INSERT INTO "Пассажиры" VALUES (2, 'Боброва А.А. ', '3000 № 7654321', 0);

INSERT INTO "Пассажиры" VALUES (3, 'Шамаров А.А. ', '3000 № 2345678', 1);

INSERT INTO "Пассажиры" VALUES (4, 'Иванов А.А. ', 'X-EP № 3456789', 0);

Заполним таблицу «Пункты»:

INSERT INTO "Пункты" VALUES (1, 'Москва');

INSERT INTO "Пункты" VALUES (2, 'Ухта');

Заполним таблицу «Марки»:

INSERT INTO "Марки" VALUES (1, 'ТУ-154', 150);

INSERT INTO "Марки" VALUES (2, 'ТУ-134', 70);

Заполним таблицу «Рейсы»:

INSERT INTO "Рейсы" VALUES (111, 1, '10:20', 1000, 1);

INSERT INTO "Рейсы" VALUES (1252, 2, '23:15', 1200, 2);

INSERT INTO "Рейсы" VALUES (115, 1, '22:20', 1000, 2);

Заполним таблицу «Авиабилеты»:

INSERT INTO "Авиабилеты" VALUES (111, '10.12.1999', 1);

INSERT INTO "Авиабилеты" VALUES (111, '10.12.1999', 2);

INSERT INTO "Авиабилеты" VALUES (1252, '10.12.1999', 3);

INSERT INTO "Авиабилеты" VALUES (111, '11.12.1999', 4);

INSERT INTO "Авиабилеты" VALUES (111, '11.12.1999', 1);

INSERT INTO "Авиабилеты" VALUES (1252, '12.12.1999', 1);

INSERT INTO "Авиабилеты" VALUES (115, '21.12.1999', 1);

Заключение

Современный подход в организации взаимодействия клиентских приложений с системами управления базами данных заключается в использовании специализированного языка управления данными. Наиболее распространенным является язык структурированных запросов (SQL).

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

Язык структурированных запросов поддерживает различные типы данных (числовые, строковые, дата и время) и широкий набор встроенных функций. Функции могут быть разделены на два больших класса: скалярные и агрегатные.

Вопросы для самопроверки

1. Перечислите, какие основные функции реализуются SQL.

2. Какие типы данных поддерживает SQL?

3. В чем особенность обработки пустых значений (NULL)?

4. Перечислите ключевые слова команды SELECT?

5. После какого ключевого слова в команде SELECT указываются источники данных?

6. Какое ключевое слово команды SELECT задает условие отбора групп?

7. Перечислите команды относящиеся к группе команд управления структурой базы данных.

8. укажите команду для создания представления.

9. Что обеспечивают команды DROP ...?

10. Что такое триггер?

11. Перечислите команды относящиеся к группе команд манипулирования данными.

12. К чему приводит удаление записи в родительской таблице в случае если определено каскадирование операции?

Глава 4
Задание к выполнению лабораторных работ

Наши рекомендации