Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная 12 Ограничения.doc
Скачиваний:
1
Добавлен:
13.11.2019
Размер:
249.86 Кб
Скачать

Государственное образовательное учреждение

Высшего профессионального образования

Санкт-Петербургский государственный политехнический университет

Факультет технической кибернетики

Кафедра измерительных информационных технологий

УТВЕРЖДЕНО

На заседании кафедры ИИТ

Протокол №4

От «__» февраля 2009 г.

Лабораторная работа № 12

по курсам

«Базы данных»

«Системы управления базами данных»

«Управление данными»

Ограничения в языке SQL

Санкт-Петербург

2009

Цель лабораторной работы: Получение навыков программирования ограничений базы данных на языке SQL.

1. Теоретические сведения

Для выполнения ограничений базы данных могут включать активные элементы. Активный элемент – это оператор, который хранится в БД и выполняется в нужный момент времени, когда для его запуска выполняется определенное условие.

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

Ограничения по ключу. Суть ограничения по ключу состоит в том, что, если атрибуты объявлены ключом, то они должны быть уникальными, и не могут совпадать для разных кортежей. Таблица может иметь несколько типов ключей: первичный ключ, объявленный как PRIMARY KEY.

Объявление первичного ключа может иметь две формы. Атрибут может объявляться первичным ключом при его появлении в таблице:

CREATE TABLE Actors

( name CHAR(30)PRIMARY KEY,

address VARCHAR(255),

ampoule VARCHAR(255),

gender CHAR(1),

birthdate DATE);

или в специальной строке с указанием имени первичного ключа, особенно, если ключ содержит несколько атрибутов, например:

CREATE TABLE Performances

( title CHAR(30),

year INTEGER,

runningTime REAL,

type CHAR(15),

theatre CHAR(20),

composer CHAR(30),

producerC# INT,

PRIMARY KEY(title,yaer,theatre));

Аналогично можно объявить уникальные атрибуты:

name CHAR(30) UNIQUE, или

UNIQUE (name),

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

Для выполнения быстрого поиска в БД можно строить индексы. Обычно индекс строится на первичном ключе отношения, но можно, используя SQL, создать также индекс на уникальном атрибуте (или вторичном ключе):

CREATE UNIQUE INDEX YearIndex ON Performances(year)

Индексы на атрибутах, объявленных ключом, имеют важное значение. Если объявлен индекс, то БД должна может применять ограничение по ключу достаточно быстро. Действительно, ограничения по ключу проверяются всякий раз, когда изменяется отношение. При наличии индекса при каждом изменении отношения БД максимально быстро проверяет ограничение, то есть, используя поиск по дереву, СУБД проверяет, имеется ли в отношении кортеж с таким же ключом. Если индексация не предусмотрена, то ограничение по ключу проверяется более медленно, путем последовательного просмотра всего отношения.

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

  • атрибуты второго отношения (на которое ссылаются внешние ключи) должны быть объявлены первичным ключом;

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

При объявлении внешнего ключа за ним следует название таблицы и имя атрибута, на который он ссылается:

REFERENCES <таблица>(<атрибут>)

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

Performances(title,year,runningTime,type,theatreName, composer, producerC#),

Producers(name,address,cert#,networth)

Первичным ключом отношения Producers является атрибут name (имя режиссера), а внешним ключом – атрибут cert# (номер его сертификата). Здесь можно использовать два варианта объявления ключей.

CREATE TABLE Performances

( title CHAR(30),

year INT,

runningTime REAL;

type CHAR(30),

theatreName CHAR(30),

composer CHAR(30),

producerC# INT REFERENCES Producers(cert#),

PRIMARY KEY (title,year,theatreName));

Во втором отношении Producers атрибут cert#, на который ссылается внешний ключ отношения Producers, должен быть объявлен первичным ключом:

CREATE TABLE Producers

( name CHAR(30),

address VARCHAR(255),

networth REAL,

cert# INT PRIMARY KEY);

Требование ссылочной целостности накладывает на отношения Performances и Producers ограничение, состоящее в том, что если в Performances имеется кортеж с определенным значением producerC#, то в отношении Producers должен быть кортеж с тем же значением cert#.

Применение правила ссылочной целостности для конкретной СУБД основано на трех правилах. Рассмотрим действие правил на примере отношений Performances и Producers.

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

Performances

Producers

Ввод в Performances нового кортежа с producerC#, имеющим значение (не NULL), не совпадающее ни с одним cert# отношения Producers

Отвергается

Обновление Performances путем изменения (не NULL) producerC# в кортеже, так, что producerC# не совпадает с нис одним cert# отношения Producers

Отвергается

Отвергается

Удаление из Producers кортежа с cert#, на который имеется ссылка.

Отвергается

Изменение в Producers атрибута cert# кортежа, на который имеется ссылка

Правило каскада состоит в том, что при удалении одного из кортежей из отношения Producers, на который имеется ссылка из отношения Performances, происходит удаление из отношения Performances кортежа, имевшего на него ссылки. При изменении в отношении Producers, атрибута cert#, на который имеется ссылка из отношения Performances, происходит изменение атрибута producerC#, чтобы ссылка сохранилась.

Performances

Producers

Следствие

Удаление из Performances кортежа со значением producerC#, который ссылался на удаленный cert#.

Причина

Удаление из Producers кортежа с cert#, на который имеется ссылка из Performances.

Следствие

Изменение в Performances атрибута producerC#, который ссылался на старый cert#

Причина

Изменение в Producers атрибута cert#, на который имеется ссылка из Performances.

Правило установки в NULL состоит в том, что при нарушении ссылочной целостности соответствующие атрибуты устанавливаются в NULL:

Performances

Producers

Следствие

Установка в NULL producerC#, который ссылался на удаленный cert#.

Причина

Удаление из Producers кортежа с cert#, на который имеется ссылка из Performances.

Следствие

Установка в NULL producerC#, который ссылался на старый cert#.

Причина

Изменение в Producers атрибута cert#, на который имеется ссылка из Performances.

Локальные и глобальные ограничения. В коммерческих базах данных можно использовать локальные ограничения на значения атрибутов и на области значений атрибутов, а также глобальные ограничения, основанные на кортежах и на операторах контроля.

Локальные ограничения. Рассмотрим ограничения на значения атрибутов, которые выражаются в двух форматах:

  • ограничения, запрещающие значение NULL;

  • ограничения CHECK, основанное на атрибутах.

Ограничение, запрещающее нулевые значения, состоит в том, что для некоторых атрибутов кортежа запрещено значение NULL. Например, можно потребовать, чтобы в таблице Performances всегда существовал сертификат для режиссера спектакля. Для этого при объявлении таблицы Performances запишем ограничение на атрибут producerC#:

CREATE TABLE Performances( …

producerC# INT REFERENCES Producers(cert#) NOT NULL).

В этом случае значение producerC# невозможно заменить на NULL, но невозможно также ввести кортеж в Performances, не определив значение producerC#, такое, которое уже имеется в Producers, и невозможно применить правило установки в NULL. В этих случаях фиксируются все нарушения ключа.

Ограничения можно изменять или отменять в любое время. Для этого необходимо присвоить ограничению имя. Можно даже присвоить имя ограничению по первичному ключу. Например, в отношении Actors(name, address, ampoule, gender, birthdate), можно даже присвоить имя ограничению по первичному ключу:

name CHAR(30) CONSTRAINT KeyName PRIMARY KEY.

Если ограничение имеет имя, то его можно отменить с помощью предложения:

ALTER TABLE Star DROP CONSTRAINT KeyName;

Основанное на атрибуте ограничение CHECK представляются в виде арифметического неравенства, или в виде условного выражения с ключевым словом WHERE. Проверка CHECK включается всегда, когда любой кортеж изменяет значение. Если обновление нарушает условия, записанные в CHECK, то обновление не выполняется. Например, предположим, что номер сертификата не может иметь меньше 6 цифр. Этот факт можно записать в виде ограничения:

CREATE TABLE Performances( …

producerC# INT REFERENCES Producers(cert#) CHECK(producerC#>=100.000))

или, допустим, что атрибут gender в отношении Actors(name,address, ampoule,gender,birthdate)должен иметь значение либо ‘F’ либо ‘M’:

CREATE TABLE Actors(…

gender CHAR(1) CHECK (gender IN (‘F’,’M’)),…)

Можно присвоить имя ограничению, основанному на кортеже, например:

CREATE TABLE Actors(…

gender CHAR(1) CONSTRAINT NoError CHECK(gender IN(‘F’,’M’)) )

Тогда при необходимости можно отменить имеющее имя ограничение на атрибуте:

ALTER TABLE Actors DROP CONSTRAINT NoError;

Можно присвоить имя ограничению области значений. Например, присвоить имя ограничению на число цифр в сертификате режиссера спектакля:

CREATE DOMAIN CertDomain INT

CONSTRAINT SixDigit CHECK(VALUE>=100000)

При этом число цифр не может быть меньше шести.

Отменить ограничение можно с помощью предложения:

ALTER DOMAIN CertDomain DROP CONSTRAINT SixDigit;

Глобальные ограничения. Глобальные ограничения проверяют связи между кортежами одного отношения или связи между несколькими отношениями. Глобальные ограничения имеют два типа:

  • ограничения CHECK, основанные на кортежах, вводят ограничения на соотношения между кортежами одного отношения;

  • операторы контроля, вводят ограничения на множества кортежей разных отношений.

Проверка ограничения CHECK, основанного на кортежах, выполняется при вставке нового кортежа или при изменении существующего кортежа в отношении, имеющем это ограничение. При невыполнении записанного в ограничении условия вставка или изменение кортежа отвергается.

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

Например, в отношение Actors(name,address,ampoule, gender, birthdate) введем ограничение, состоящее в том, что если актер мужчина, то его имя не должно начинаться с “Ms”.

CREATE TABLE Star(

name CHAR(30) PRIMARY KEY,

address VARCHAR(255),

gender CHAR(1),

birthdate DATE,

CHACK(gender=’F’ OR name NOT LIKE ‘Ms%’)).

Условие ограничения выполняется для женщин актеров и для актеров, чье имя не начинается с “Ms”. Ограничение не выполняется только для мужчин, чье имя начинается с “Ms”.

При необходимости можно присвоить имя ограничению, основанному на кортеже:

CONSTRAINT RightName

CHECK(gender=’F’ OR name NOT LIKE ‘Ms%’)

и отменить ограничение, имеющее имя:

ALTER TABLE Actors DROP CONSTRAINT RightName;

Ограничения на кортежи не проверяет условия, которые накладываются на отношение в целом, например, ограничения на сумму элементов столбца. Чтобы выполнить такую проверку, необходимо вводить операторы контроля. Операторы контроля – это ограничения, включающие в проверку отношения в целом, причем условие проверки записывается в пункте WHERE предложения SELECT-FROM-WHERE. Утверждение записывается как элемент схемы, следующим образом:

CREATE ASSERTION <имя утверждения> CHECK <условие>

Условие, записанное в утверждении, должно всегда выполняться. Действия, нарушающие условия отвергаются базой данных.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]