27_SH43-0144-00 (1038594), страница 31
Текст из файла (страница 31)
Целью является поддержаниецелостности в случаях, когда один объект базы данных ссылается на другой.Например, пусть и первичный, и внешний ключи содержат столбец с номеромотдела фирмы. В таблице сотрудников EMPLOYEE этот столбец называетсяWORKDEPT (отдел), а в таблице отделов DEPARTMENT - DEPTNO (номеротдела). Связь между двумя этими таблицами задается следующимиограничениями:v Для каждого работника в таблице EMPLOYEE существует только один номеротдела и этот номер отдела существует в таблице DEPARTMENT.v Каждая строка таблицы EMPLOYEE связана не более чем с одной строкойтаблицы DEPARTMENT.
Между таблицами существует отношение.v Каждая строка таблицы EMPLOYEE, содержащая непустое значениеWORKDEPT, связана со строкой с столбце DEPTNO таблицы DEPARTMENT.v Таблица DEPARTMENT является родительской таблицей, а таблицаEMPLOYEE - зависимой таблицей.Оператор SQL, определяющий родительскую таблицу DEPARTMENT:CREATE TABLE DEPARTMENT(DEPTNOCHAR(3)NOT NULL,DEPTNAME VARCHAR(29) NOT NULL,MGRNOCHAR(6),ADMRDEPT CHAR(3)NOT NULL,LOCATION CHAR(16)PRIMARY KEY (DEPTNO)IN RESOURCE,)Оператор SQL, определяющий зависимую таблицу EMPLOYEE:CREATE TABLE EMPLOYEE(EMPNOCHAR(6)NOT NULL PRIMARY KEY,FIRSTNME VARCHAR(12) NOT NULL,LASTNAME VARCHAR(15) NOT NULL,WORKDEPT CHAR(3),PHONENO CHAR(4),PHOTOBLOB(10m) NOT NULL,FOREIGN KEY DEPT (WORKDEPT)REFERENCES DEPARTMENT ON DELETE NO ACTION)IN RESOURCEЗадав столбец DEPTNO в качестве первичного ключа таблицы DEPARTMENT истолбец WORKDEPT в качестве внешнего ключа таблицы EMPLOYEE, выопределяете реляционное ограничение на значения WORKDEPT.
Этоограничение обеспечивает реляционную целостность значений в этих двухтаблицах. В данном случае для всех работников, добавляемых в таблицуEMPLOYEE, должны задаваться номера отделов, существующие в таблицеDEPARTMENT.130Руководство администратора: РеализацияДля этого реляционного ограничения в таблице EMPLOYEE задано правилоудаления NO ACTION, что означает, что отдел не будет удаляться из таблицыDEPARTMENT, если в этом отделе есть сотрудники.Хотя в предыдущих примерах для добавления реляционного ограниченияиспользовался оператор CREATE TABLE, для этого можно также использоватьоператор ALTER TABLE. Смотрите раздел “Изменение структуры исодержимого таблицы” на стр. 194.Другой пример: Используются те же определения таблиц, что и в предыдущемпримере.
Таблица DEPARTMENT создается раньше таблицы EMPLOYEE.Каждый отдел имеет руководителя и эти руководители указаны в таблицеEMPLOYEE. Столбец MGRNO (номер руководителя) в таблице DEPARTMENTиспользуется как внешний ключ таблицы EMPLOYEE. Реляционные связиобразуют цикл, что порождает некоторые проблемы с этим ограничением.Внешний ключ можно добавить позднее (смотрите раздел “Добавлениепервичных и внешних ключей” на стр. 197). Можно также использоватьоператор CREATE SCHEMA, чтобы создать обе таблицы EMPLOYEE иDEPARTMENT одновременно (смотрите пример в руководстве SQL Reference).Условие FOREIGN KEY: Внешний ключ ссылается на первичный ключ илиключ уникальности в той же или другой таблице.
Задание внешнего ключауказывает, что реляционная целостность должна поддерживаться в соответствиис заданными реляционными ограничениями. Для определения внешнего ключаиспользуется условие FOREIGN KEY оператора CREATE TABLE или ALTERTABLE.Число столбцов внешнего ключа должно совпадать с числом столбцовсоответствующего первичного или уникального ограничения (называемогородительским ключом) родительской таблицы.
Кроме того, соответствующиекомпоненты определений столбцов ключей должны иметь совпадающие типыданных и длины. Внешнему ключу можно присвоить имя ограничения. Если этоимя не задано, оно будет присвоено автоматически. Для упрощения работырекомендуется задавать имя ограничения, а не использовать имя,сгенерированное системой.Значение составного внешнего ключа совпадает со значением родительскогоключа, если значение каждого столбца внешнего ключа совпадает со значениемсоответствующего столбца родительского ключа. Внешний ключ, содержащийпустые значения, не может совпадать со значениями родительского ключа,поскольку родительский ключ по определению не может содержать пустыезначения.
Однако пустое значение внешнего ключа всегда допустимо,независимо от значений его непустых компонентов.Для определений внешних ключей применяются следующие правила:v Таблица может иметь много внешних ключейГлава 3. Создание базы данных131v У внешнего ключа допускается пустое значение, если какому-либо из егокомпонентов разрешено иметь пустые значенияv Внешний ключ имеет пустое значение, если любой из его компонентов имеетпустое значение.Условие REFERENCES: Условие REFERENCES задает родительскую таблицудля отношения и определяет необходимые ограничения. Его можно включить вопределение столбца или задать как отдельное условие, сопровождающееусловие FOREIGN KEY, в операторах CREATE TABLE или ALTER TABLE.Если условие REFERENCES задано в качестве ограничения для столбца, изперечисленных имен столбцов составляется неявный список столбцов.
Учтите,что у нескольких столбцов могут быть отдельные условия REFERENCES, а уодного столбца может быть несколько таких условий.Условие REFERENCES содержит правило удаления. В нашем примереиспользуется правило удаления ON DELETE NO ACTION, которое указывает,что отделы нельзя удалять, если в них есть сотрудники. Другие правилаудаления: ON DELETE CASCADE, ON DELETE SET NULL и ON DELETERESTRICT. Дополнительную информацию о правилах DELETE при реализацииреляционной целостности смотрите в руководстве Руководство администратора:Планирование.Влияние на операции утилит: Утилита LOAD отключает проверку ограниченийдля автореферентных и зависимых таблиц и переводит эти таблицы в состояниеотложенной проверки.
После завершения работы утилиты LOAD нужновключить проверку ограничений для всех таблиц, для которых она былаотключена. Например, если в состояние отложенной проверки были переведенытолько таблицы DEPARTMENT и EMPLOYEE, можно выполнить следующуюкоманду:SET INTEGRITY FOR DEPARTMENT, EMPLOYEE IMMEDIATE CHECKEDРеляционные ограничения влияют на утилиту IMPORT так:v Функции REPLACE и REPLACE CREATE не разрешены, если от таблицыобъектов зависят какие-либо другие таблицы.Чтобы использовать эти функции, сначала отбросьте все внешние ключи, вкоторых эта таблица является родительской.
Завершив импорт, зановосоздайте эти внешние ключи с помощью оператора ALTER TABLE.v Успех импорта в таблицу с автореферентными ограничениями зависит отпорядка, в котором импортируются столбцы.Определение проверочных ограничений таблицыПроверочное ограничение таблицы задает условие поиска, применяемое длякаждой строки таблицы, для которой определено это проверочное ограничениетаблицы. Для создания проверочного ограничения таблицы при создании или132Руководство администратора: Реализацияизменении этой таблицы с ней связывается определение проверочногоограничения. Это ограничение автоматически активируется, когда операторыINSERT или UPDATE изменяют данные в этой таблице. Проверочноеограничение таблицы не влияет на операторы DELETE или SELECT.Проверочное ограничение может быть связано с типизированной таблицей.Имя ограничения не может совпадать с именами других ограничений, заданныхв том же операторе CREATE TABLE.
Если имя ограничения не задано, системасгенерирует 18-символьный уникальный идентификатор для этого ограничения.Проверочное ограничение таблицы применяется для задания правилцелостности данных, не обеспечиваемых уникальностью ключей илиреляционными ограничениями. В некоторых случаях проверочное ограничениетаблицы может использоваться для выполнения проверки домена. Следующееограничение, заданное в операторе CREATE TABLE, гарантирует, что датаначала некоторого действия не будет больше даты его завершения:CREATE TABLE EMP_ACT(EMPNOCHAR(6)NOT NULL,PROJNOCHAR(6)NOT NULL,ACTNOSMALLINTNOT NULL,EMPTIMEDECIMAL(5,2),EMSTDATE DATE,EMENDATE DATE,CONSTRAINT ACTDATES CHECK(EMSTDATE <= EMENDATE) )IN RESOURCEХотя в предыдущих примерах для добавления проверочного ограничениятаблицы использовался оператор CREATE TABLE, для этого можно такжеиспользовать оператор ALTER TABLE.
Смотрите раздел “Изменение структурыи содержимого таблицы” на стр. 194.||||||||Определение генерируемых столбцов в новых таблицахГенерируемый столбец определяется в базовой таблице, если сохраняемоезначение не задается операциями вставки или изменения, а вычисляется понекоторой формуле. Если при создании таблицы известно, что для нее все времябудут использоваться определенные выражения или предикаты, можно добавитьв эту таблицу один или несколько генерируемых столбцов. Генерируемыестолбцы позволяют улучшить производительность выполнения запросов дляданных этой таблицы.||||Например, вычисления выражений могут значительно влиять напроизводительность в следующих двух случаях:1. Вычисление выражения должно выполняться в запросе много раз.2.
Требуются сложные вычисления.||Чтобы улучшить производительность запроса, можно определитьдополнительный столбец, который будет содержать результаты вычислений дляГлава 3. Создание базы данных133|||данного выражения. Затем в запросе, в котором используется это же выражение,можно непосредственно использовать этот генерируемый столбец; этотгенерируемый столбец также может подставить вместо выражения оптимизатор.|Для генерируемого столбца можно также создать неуникальный индекс.|||Для запросов, объединяющих данные двух или нескольких таблиц, добавлениегенерируемого столбца может позволить оптимизатору выбрать лучшуювозможную стратегию объединения.|||||||Ниже показан пример определения генерируемого столбца в операторе CREATETABLE:|||Создав таблицу, можно использовать эти генерируемые столбцы для созданияиндексов. Например,|||Генерируемые столбцы может быть выгодно использовать в запросах.Например,||можно переписать как||Другой пример:||можно написать как|||||Генерируемые столбцы будут использоваться для улучшенияпроизводительности запросов.
Полученные генерируемые столбцы будуттакими же, как если бы они были добавлены после создания и заполнениятаблицы. Дополнительную информацию смотрите в разделе “Создание изаполнение таблицы” на стр. 123.CREATE TABLE t1 (c1c2c3c4INT,DOUBLE,DOUBLE GENERATED ALWAYS AS (c1 + c2)GENERATED ALWAYS AS(CASE WHEN c1 > c2 THEN 1 ELSE NULL END))CREATE INDEX i1 ON t1(c4)SELECT COUNT(*) FROM t1 WHERE c1 > c2SELECT COUNT(*) FROM t1 WHERE c4 IS NOT NULLSELECT c1 + c2 FROM t1 WHERE (c1 + c2) * c1 > 100SELECT c3 FROM t1 WHERE c3 * c1 > 100Создание пользовательской временной таблицы|||||Для определения временной таблицы используется оператор DECLAREGLOBAL TEMPORARY TABLE. Этот оператор используется в прикладнойпрограмме. Эта пользовательская временная таблица существует, только покаприкладная программа соединена с базой данных.134Руководство администратора: Реализация|||Описание этой таблицы не появляется в системном каталоге, поэтому онанедоступна для других прикладных программам и не может имииспользоваться.|||Когда использующая эту таблицу прикладная программа завершает работу иотсоединяется от базы данных, из таблицы удаляются все данные и она неявноотбрасывается.||||||Пример определения временной таблицы:|||||||||||||Этот оператор создает пользовательскую временную таблицу с именемgbl_temp.
Эта пользовательская временная таблица определяется со столбцами,имеющими в точности те же имена и описания, что и столбцы таблицыempltabl. Такое неявное определение включает только такие атрибутыстолбцов, как имя, тип данных, допустимость пустых значений и значение поумолчанию. Все остальные атрибуты столбцов (ограничения уникальности,ограничения внешних ключей, триггеры и индексы) не определяются.
Если дляэтой таблицы не открыт указатель WITH HOLD, при выполнении операциипринятия (COMMIT) из нее удаляются все данные. Информация об измененияхдля пользовательской временной таблицы не записывается в журнал.Пользовательская временная таблица помещается в указанное пользовательскоевременное табличное пространство. Это табличное пространство должносуществовать, иначе объявление этой таблицы будет ошибочным.||Дополнительную информацию об операторе DECLARE GLOBAL TEMPORARYTABLE смотрите в руководстве SQL Reference.||||||Примечание: Пользовательские временные таблицы не поддерживают:v Столбцы с типом большой объект (или с пользовательскимтипом на основе большого объекта)|||||DECLARE GLOBAL TEMPORARY TABLE gbl_tempLIKE empltablON COMMIT DELETE ROWSNOT LOGGEDIN usr_tbspv Столбцы с пользовательскими типамиv Столбцы LONG VARCHARv Столбцы DATALINKОпределение столбца идентификации в новой таблицеСтолбец идентификации позволяет DB2 автоматически генерироватьгарантированно уникальное числовое значение для каждой строки, добавляемойк таблице.