- •7.7.6. Определить общее количество поставщиков
- •7.7.7. Определить в поставках максимальное
- •7.7.8. Для каждой поставляемой детали указать номер и общий объем поставки в штуках
- •7.7.9. Указать номера всех типов деталей, поставляемых более чем одним поставщиком
- •7.7.10. Определить имена поставщиков детали с номером т2'
- •7.7.11. Определить имена поставщиков по крайней мере одной красной детали
- •7.7.12. Указать номера поставщиков, статус которых меньше текущего максимального статуса
- •7.7.13. Указать имена поставщиков детали с номером 'р2'
- •7.7.14. Выбрать имена поставщиков, которые не поставляют деталь с номером 'р2'
- •7.7.15. Определить имена поставщиков всех типов деталей
- •7.7.16. Определить номера деталей, которые либо весят более 16 фунтов, либо поставляются поставщиком с номером 's2', либо и то, и другое
- •7.8. Резюме
- •8.2. Ограничения типа
- •8.3. Ограничения атрибута
- •8.4. Ограничения переменной-отношения
- •8.5. Ограничения баз данных
- •8.6. "Золотое правило"
- •8.7. Ограничения состояния и ограничения перехода
- •8.8. Ключи
- •3. Пусть r1 и r2 — ссылающаяся и ссылочная переменные-отношения соответственно.
- •8.9. Средства языка sql
- •8.10. Резюме
- •9.1. Введение
- •9.2. Для чего нужны представления
- •9.3. Выборка данных из представлений
- •9.4. Обновление данных в представлениях
- •9.5. Моментальные снимки
- •9.6. Поддержка представлений в языке sql
- •9.7. Резюме
- •Часть III
- •10.1. Введение
- •10.2. Основные определения
- •10.3. Тривиальные и нетривиальные зависимости
- •10.4. Замыкание множества зависимостей
- •10.5. Замыкание множества атрибутов
- •10.6. Неприводимые множества зависимостей
- •10.7. Резюме
- •Глава 1 1
- •I Переменные-отношения в знф I
- •11.2. Декомпозиция без потерь
- •11.3. Первая, вторая и третья нормальные формы
- •11.4. Сохранение зависимостей
- •11.5. Нормальная форма Бойса-Кодда
- •11.6. Замечание по поводу атрибутов, содержащих в качестве значений отношения
- •11.7. Резюме
- •12.1. Введение
- •12.2. Многозначные зависимости и четвертая нормальная форма
- •12.3. Зависимости соединения и пятая нормальная форма
- •Соединение по комбинации атрибутов j#,s#
- •Исходное состояние spj
- •12.4. Общая схема процедуры нормализации
- •12.5. Денормализация
- •12.6. Ортогональное проектирование (небольшое отступление от темы)
- •12.7. Другие нормальные формы
- •12.8. Резюме
- •12.3. Brosda V., Vossen g. Update and Retrieval Through a Universal Schema Interface // acm tods. — December, 1988. — 13, № 4.
- •12.5. Date c.J. Will the Real Fourth Normal Form Please Stand Up? // c. J. Date and Hugh Darwen. Relational Database Writings 1989-1991.— Reading, Mass.: Addison-Wesley, 1992.
- •12.20.Kent w. The Universal Relation Revisited // acm tods. — December, 1983. — 8, № 4.
- •12.22.Maier d., Ullman j.D. Fragments of Relations // Proc. 1983 sigmod Intern. Conf. On Management of Data. — San Jose, Calif. — May, 1983.
- •12.24.Maier d., Ullman j.D. Maximal Objects and the Semantics of Universal Relation Databases // acm tods. — March, 1983. — 8, № 1.
- •Глава 13
- •13.1. Введение
- •13.2. Общий подход
- •Каждыи экземпляр сущности ности «Произведение"
- •13.3. Модель "сущность/связь"
- •13.5. Проектирование базы данных с помощью метода er-моделирования
- •13.6. Краткий анализ er-модели
- •13.7. Резюме
8.9. Средства языка sql
Классификация ограничений целостности в языке SQL довольно сильно отличается от схемы, описанной в разделах 8.1-8.5. В языке SQL все ограничения делятся на три категории:
ограничения домена;
ограничения базовой таблицы;
общие ограничения (иначе называемые утверждениями).
Однако ограничения домена— это не то же самое, что обсуждавшиеся выше ограничения типа, а ограничения базовой таблицы отличаются от обсуждавшихся здесь ограничений переменной-отношения. Аналогично утверждения отличаются от понятия ограничений базы данных. Укажем некоторые особенности, касающиеся упомянутых понятий языка SQL.
В действительности в языке SQL вовсе нет ограничений типа (поскольку язык SQL не поддерживает никаких типов, за исключением небольшого количества встроенных типов).
Понятие ограничения домена в языке SQL представляет некоторую сомнительную обобщенную форму нашего ограничения атрибута (напомним, что домены в стиле языка SQL в реляционном смысле доменами не являются).
Ограничения базовой таблицы и утверждения языка SQL (которые фактически взаимозаменяемы) упрощенно можно считать равносильными нашим ограничениям переменной-отношения и базы данных, вместе взятым.
Также отметим, что в языке SQL совершенно отсутствует поддержка ограничений перехода. В настоящее время не поддерживаются и триггерные процедуры, хотя их поддержка уже включена в новый стандарт SQL3 (см. приложение Б).
Ограничения домена
В языке SQL ограничения домена представляют собой ограничения, применяемые к каждому столбцу, объявленному принадлежащим к данному домену. Приведем пример определения домена.
CREATE DOMAIN COLOR CHAR(6) DEFAULT '???' CONSTRAINT VALID_C0L0RS CHECK ( VALUE IN
{ 'Red', 'Yellow', 'Blue', 'Green', '???' ) ) ;
Предположим, что оператор CREATE TABLE для базовой таблицы Р (таблицы деталей) выглядит следующим образом.
CREATE TABLE Р { ... , COLOR COLOR, ... ) ;
Если пользователь вставляет в таблицу Р только часть новой строки, не содержащую значение для столбца COLOR, то по умолчанию в этот столбец будет помещено значение '???'. Если же пользователь укажет значение для столбца COLOR, но это значение не будет принадлежать диапазону допустимых для него значений, то операция не будет выполнена и система выдаст сообщение, в котором будет указано о нарушении пользователем ограничения VALID_COLORS.
Как было показано в разделе 8.2, концептуально ограничения домена являются (или, скорее, должны являться) ничем иным, как перечнем значений, которые составляют этот домен, и приведенный выше пример ограничения VALID_C0L0RS, конечно, следует этому определению. Однако в общем случае язык SQL позволяет включать в определение ограничений доменов логические выражения произвольной сложности. Это предоставляет возможность указывать, например, что допустимые значения некоторого домена D могут зависеть от значений указанного атрибута, присутствующих в настоящий момент в некоторой таблице Т. Читатель может поразмышлять о возможных последствиях такой неоправданной вседозволенности.
Ограничения базовой таблицы
В языке SQL существуют следующие виды ограничений базовой таблицы:
определение потенциального ключа;
определение внешнего ключа;
определение "проверочного условия".
Ниже каждое из них обсуждается подробнее.
Замечание. В языке SQL каждому определению ограничений может предшествовать предложение вида CONSTRAINT <имя ограничение, задающее имя нового ограничения (это замечание верно и для ограничений доменов, как мы уже убедились на примере ограничения VALID_COLORS). В приводимых ниже примерах мы будем игнорировать эту возможность.
Потенциальные ключи
Определение потенциального ключа записывается в следующем виде. UNIQUE ( <список имен столбцов> }
Возможна и другая форма записи. PRIMARY KEY ( <список имен столбцов> )
В обоих случаях параметр <список имен столбцов> не должен быть пустым. Для заданной базовой таблицы может существовать не более одной спецификации PRIMARY KEY (первичный ключ) и любое количество спецификаций UNIQUE (альтернативные ключи). В случае первичного ключа для каждого из указанных столбцов дополнительно подразумевается наличие в определении спецификации NOT NULL, даже если эта спецификация не была указана явно. Проверка выполнения ограничений будет обсуждаться ниже.
Внешние ключи
Определение внешнего ключа записывается следующим образом.
FOREIGN KEY ( <список имен столбцов> )
REFERENCES <имя базовой таблицы> [ ( <список имен столбцов> ) ] [ ON DELETE <ссылочная операция> ] [ ON UPDATE <ссылочная операция> ]
Здесь параметр <ссылочная операция> может принимать значения NO ACTION (по умолчанию), CASCADE, SET DEFAULT и SET NULL. Опции SET DEFAULT и SET NULL будут рассматриваться в главе 18. Второй параметр <список имен столбцов> необходим в том случае, если внешний ключ ссылается на потенциальный ключ, который не является первичным ключом.
Замечание. Соответствие "внешний ключ — потенциальный ключ" устанавливается не на основе имен столбцов, а на основе позиции (слева направо) в списках имен атрибутов.
Проверочные условия
Определение проверочного условия (проверочного ограничения) имеет следующий вид. CHECK ( <условное выражение> )
Попытка создания строки г в базовой таблице Т рассматривается как нарушение проверочного ограничения для таблицы Т, если в результате вычисления указанного в этом ограничении условного выражения для строки г будет получено значение ложь.
Замечание. Условное выражение в языке SQL является аналогом того, что ранее мы называли логическим (или булевым) выражением. Эти выражения подробно рассматриваются в приложении А. В частности, отметим, что в данном контексте условное выражение может быть сколь угодно сложным. Не требуется, чтобы условие ограничения включало ссылки только на таблицу Т; оно может иметь ссылки на что угодно в базе данных. Читателю, опять-таки, будет полезно поразмышлять над тем, какими могут быть последствия такой неоправданной вседозволенности.
Вот пример создания таблицы с помощью оператора CREATE TABLE, в котором используются ограничения базовой таблицы всех трех типов.
CREATE TABLE SP
( St St NOT NULL, Pi Pi NOT NULL, QTY QTY NOT NULL, PRIMARY KEY ( St, Pi ), FOREIGN KEY ( St ) REFERENCES S
ON DELETE CASCADE
ON UPDATE CASCADE, FOREIGN KEY ( Pi ) REFERENCES P
ON DELETE CASCADE
ON UPDATE CASCADE, CHECK ( QTY > 0 AND QTY < 5001 ) ) ;
Здесь подразумевается, что домены Si, Pi и QTY уже определены, а атрибуты Si и Р| явно определены как первичные ключи для таблиц S и Р соответственно. Также здесь умышленно применяется соглашение по сокращению, благодаря которому проверочное условие вида
CHECK ( <имя стол6ца> IS NOT NULL )
в определении рассматриваемого столбца можно заменить простой спецификацией NOT NULL. В соответствии с данным правилом в этом примере три достаточно громоздких проверочных условия заменены тремя простейшими спецификациями NOT NULL.
Завершая подраздел, обратим внимание на некоторую "странность": считается, что ограничение базовой таблицы SQL всегда удовлетворено, если базовая таблица пуста, причем даже в случае ограничения вида "эта таблица не должна быть пустой"!
Утверждения
Рассмотрим третий случай: общие ограничения, иначе называемые утверждениями. Общие ограничения создаются с помощью оператора CREATE ASSERTION, имеющего следующий синтаксис.
CREATE ASSERTION <имя ограничение CHECK ( <условное выражение> ) ;
Здесь параметр <имя ограничение задает имя создаваемого ограничения, а параметр <условное выражение> определяет проверяемое условное выражение. Для отмены общего ограничения используется оператор DROP ASSERTION.
DROP ASSERTION <имя ограничение ;
Отметим, что в отличие от всех других форм SQL-оператора отмены DROP, приведенных в этой книге (DROP DOMAIN, DROP TABLE, DROP VIEW), оператор DROP ASSERTION не содержит опций RESTRICT и CASCADE.
Вот несколько примеров утверждений, создаваемых с помощью оператора CREATE ASSERTION.
1. Каждый поставщик должен иметь статус не менее 5.
CREATE ASSERTION IC13 CHECK
( ( SELECT MIN ( S.STATUS ) FROM S ) > 4 ) ;
2. Значение веса любой детали должно быть положительным.
CREATE ASSERTION IC18 CHECK
{ NOT EXISTS ( SELECT * FROM P
WHERE NOT ( P.WEIGHT > 0 ) ) ) ;
3. Все красные детали должны храниться в Лондоне.
CREATE ASSERTION IC99 CHECK
( NOT EXISTS ( SELECT * FROM P
WHERE P.COLOR = 'Red'
AND P.CITY <> 'London' ) ) ;
4. He допускаются поставки с общим весом (произведение количества деталей и их веса), превышающим 20 ООО фунтов.
CREATE ASSERTION IC46 CHECK
( NOT EXISTS ( SELECT * FROM P, SP WHERE P.P# = SP.Pi
AND ( P.WEIGHT * SP.QTY ) > 20000.0 ) ) ;
5. Поставщики со статусом, меньшим 20, не имеют права поставлять любую деталь в количестве более 500 штук.
CREATE ASSERTION IC95 CHECK
( NOT EXISTS ( SELECT * FROM S, SP WHERE S.STATUS < 20 AND S.Sf = SP.SI AND SP.QTY > 500 ) ) ;
Откладываемая проверка
Классификация ограничений целостности в языке SQL отличается от нашей также в отношении вопроса, когда должна выполняться проверка. В нашей схеме ограничения базы данных проверяются во время выполнения оператора COMMIT, а остальные ограничения проверяются немедленно. В языке SQL подход иной и ограничения могут быть определены как откладываемые и неоткладываемые (опции DEFERRABLE и NOT DEFERRABLE соответственно). Если ограничение откладываемое, оно дополнительно может быть определено как исходно откладываемое (INITIALLY DEFERRED) или исходно выполняемое (INITIALLY IMMEDIATE), что определяет состояние ограничения в начале выполнения каждой транзакции. Неоткладываемые ограничения всегда проверяются немедленно, а откладываемые могут динамически включаться и отключаться с помощью оператора, синтаксис которого приведен ниже.
SET CONSTRAINTS <список имен ограничений> <параметр> ;
Здесь параметр <параметр> — это или ключевое слово IMMEDIATE (немедленно), или ключевое слово DEFERRED (отложено). Примером может служить следующее утверждение.
SET CONSTRAINTS IC46, IC95 DEFERRED ;
Откладываемые ограничения проверяются только тогда, когда они находятся в состоянии IMMEDIATE (немедленно). Установка откладываемого ограничения в состояние IMMEDIATE, естественно, приводит к тому, что оно проверяется немедленно. Если проверка завершается ошибкой, то завершается ошибкой и оператор SET IMMEDIATE. При выполнении операции завершения транзакции (COMMIT) все откладываемые ограничения целостности переходят в выполняемое состояние IMMEDIATE и если какая-либо проверка завершается ошибкой, выполняется откат транзакции.
