Мартин Грубер - Понимание SQL (991940), страница 33
Текст из файла (страница 33)
INSERT, конечно, к делу не относится. Он помещает новые значения родительского ключа в таблицу, так что ни одно из этих значений не может быть вызвано в данный момент. Однако, вы можете захотетьпозволить модификациям быть каскадными, но без удалений, и наоборот. Лучшейможет быть ситуация, которая позволит вам определять любую из трех категорий, независимо от команд UPDATE и DELETE. Мы будем следовательно ссылаться на эффект модификации (update effects) и эффект удаления (delete effects), которыеопределяют, что случится, если вы выполните команды UPDATE или DELETE в родительском ключе. Эти эффекты, о которых мы говорили, называются:Ограниченные (RESTRICTED) изменения,Каскадируемые (CASCADES) изменения, иПустые (NULL) изменения.Фактические возможности вашей системы должны быть в строгом стандартеANSI — это эффекты модификации и удаления, оба, автоматически ограниченнные —для более идеальной ситуации описаной выше. В качестве иллюстрации, мы покажемнесколько примеров того, что вы можете делать с полным набором эффектов модификации и удаления.
Конечно, эффекты модификации и удаления, являющиеся нестандартными средствами, испытывают недостаток в стандартном госинтаксисе.Синтаксис который мы используем здесь, прост в написании и будет служить в дальнейшем для иллюстрации функций этих эффектов.Для полноты эксперимента, позволим себе предположить что вы имеете причину изменить поле snum таблицы Продавцов в случае, когда наша таблица Продавцовизменяет разделы. (Обычно изменение первичных ключей это не то что мы рекомендуем делать практически.
Просто это еще один из доводов для имеющихся первичныхключей которые не умеют делать ничего другого кроме как, действовать как первичные ключи: они не должны изменяться.) Когда вы изменяете номер продавца, вы хотите чтобы были сохранены все его заказчики. Онако, если этот продавец покидаетсвою фирму или компанию, вы можете не захотеть удалить его заказчиков, при удалении его самого из базы данных. Взамен, вы захотите убедиться, что заказчики назначены кому-нибудь еще. Чтобы сделать это вы должны указать UPDATE сКаскадируемым эффектом, и DELETE с Ограниченным эффектом.CREATE TABLE Customers(cnuminteger NOT NULL PRIMARY KEY,cname char(10) NOT NULL,citychar(10),rating integer,snuminteger REFERENCES Salespeople,UPDATE OF Salespeople CASCADES,DELETE OF Salespeople RESTRICTED);Если вы теперь попробуете удалить Peel из таблицы Продавцов, команда будетне допустима, пока вы не измените значение поля snum заказчиков Hoffman иClemens для другого назначенного продавца.
С другой стороны, вы можете изменитьзначение поля snum для Peel на 1009, и Hoffman и Clemens будут также автоматически изменены.Третий эффект — Пустые (NULL) изменения. Бывает, что когда продавцы оставляют компанию, их текущие порядки не передаются другому продавцу. С другойстороны, вы хотите отменить все порядки автоматически для заказчиков, чьи счета выудалите. Изменив номера продавца или заказчика, можно просто передать их ему.Пример ниже показывает, как вы можете создать таблицу Порядков с использованиемэтих эффектов.CREATE TABLE Orders(onum integer NOT NULL PRIMARY KEY,amtdecimal,odate date NOT NULLcnum integer NOT NULL REFERENCES Customerssnum integer REFERENCES Salespeople,UPDATE OF Customers CASCADES,DELETE OF Customers CASCADES,UPDATE OF Salespeople CASCADES,DELETE OF Salespeople NULLS);Конечно, в команде DELETE с эффектом Пустого изменения в таблице Продавцов, ограничение NOT NULL должно быть удалено из поля snum.ВНЕШНИЕ КЛЮЧИ, КОТОРЫЕ ССЫЛАЮТСЯ ОБРАТНО КИХ ПОДЧИНЕНЫМ ТАБЛИЦАМКак было упомянуто ранее, ограничение FOREIGN KEY может представить имяэтой частной таблице, как таблицы родительского ключа.
Далеко не будучи простой,эта особенность может пригодиться. Предположим, что мы имеем таблицу Employeesс полем manager (администратор). Это поле содержит номера каждого из служащих,некоторые из которых являются еще и администраторами.Но так как каждый администратор — в то же время остается служащим, то онестественно будут также представлен в этой таблице.
Давайте создадим таблицу, гденомер служащего (столбец с именем empno), объявляется как первичный ключ, а администратор, как внешний ключ, будет ссылаться на нее:CREATE TABLE Employees(empnointeger NOT NULL PRIMARY KEY,namechar(10) NOT NULL UNIOUE,manager integer REFERENCES Employees);(Так как внешний ключ это ссылаемый первичный ключ таблицы, список столбцов может быть исключен.) Имеется содержание этой таблицы:EMPNO1003200716882002NAMETerrenceAtaliMcKennaCollierMANAGER2007NULL10032007Как вы можете видеть, каждый из них (но не Atali), ссылается на другого служащего в таблице как на своего администратора. Atali, имеющий наивысший номер втаблице, должен иметь значение установленное в NULL.
Это дает другой принципсправочной целостности. Внешний ключ, который ссылается обратно к частной таблице, должен позволять значения = NULL. Если это не так, как бы вы могли вставитьпервую строку ?Даже если эта первая строка ссылается к себе самой, значение родительскогоключа должно уже быть установлено, когда вводится значение внешнего ключа.
Этотпринцип будет верен, даже если внешний ключ ссылается обратно к частной таблицене напрямую, а с помощью ссылки к другой таблице, которая затем ссылается обратно к таблице внешнего ключа. Например, предположим, что наша таблица Продавцовимеет дополнительное поле, которое ссылается на таблицу Заказчиков, так, что каждая таблица ссылается на другую, как показано в следующем операторе CREATETABLE:CREATE(snumsnamecitycommcnumTABLE Salespeopleinteger NOT NULL PRIMARY KEY,char(10) NOT NULL,char(10),declmal,integer REFERENCES Customers);CREATE TABLE Customers(cnuminteger NOT NULL PRIMARY KEY,cname char(10) NOT NULL,citychar(10),rating integer,snuminteger REFERENCES Salespeople);Это называется — перекрестной ссылкой.SQL поддерживает это теоретически, но практически это может составить проблему.
Любая таблица из этих двух, созданная первой является ссылочной таблицейкоторая еще не существует для другой. В интересах обеспечения перекрестной ссылки, SQL фактически позволяет это, но никакая таблица не будет пригодна для использования, пока они обе находятся в процессе создания. С другой стороны, если эти дветаблицы создаются различными пользователями, проблема становится еще болеетрудной. Перекрестная ссылка может стать полезным инструментом, но она не безнеоднозначности и опасностей.
Предшествующий пример, например, не совсем пригоден для использования: потому что он ограничивает продавца одиночным заказчиком, и кроме того совсем необязательно использовать перекресную ссылку, чтобыдостичь этого. Мы рекомендуем чтобы вы были осторожны в его использовании ианализировали, как ваши программы управляют эффектами модификации и удаления, а также процессами привилегий и диалоговой обработки запросов перед тем, каквы создаете перекресную систему справочной целостности.
(Привилегии и диалоговая обработка запросов будут обсуждаться, соответственно, в Главах 22 и 23.)РЕЗЮМЕТеперь вы имеете достаточно хороше управление справочной целостностью.Основная идея в том, что все значения внешнего ключа ссылаются к указанной строкеродительского ключа. Это означает, что каждое значение внешнего ключа должнобыть представлено один раз, и только один раз, в родительском ключе. Всякий раз,когда значение помещается во внешний ключ, родительский ключ проверяется, чтобыудостовериться, что его значение представлено; иначе, команда будет отклонена. Родительский ключ должен иметь Первичный Ключ (PRIMARY KEY) или Уникальное(UNIQUE) ограничение, гарантирующее, что значение не будет представлено болеечем один раз. Попытка изменить значение родительского ключа, которое в настоящеевремя представлено во внешнем ключе, будет вообще отклонена.
Ваша система может, однако, предложить вам выбор, чтобы получить значение внешнего ключа установленого в NULL или для получения нового значения родителького ключа, и указаниякакой из них может быть получен независимо для команд UPDATE и DELETE.Этим завершается наше обсуждение команды CREATE TABLE. Далее мы представим вас другому типу команды — CREATE. В Главе 20 вы обучитесь представлению объектов данных, которые выглядят и действуют подобно таблице, но вдействительности являются результатами запросов. Некоторые функции ограничениймогут также выполняться представлениями, так что вы сможете лучше оценить вашупотребность к ограничениям, после того, как вы прочитаете следующие три главы.РАБОТА С SQL1.