Мартин Грубер - Понимание SQL (991940), страница 31
Текст из файла (страница 31)
Мы назвали этот тип связи — справочной целостностью; и в ходеобсуждения, вы видели как ее можно использовать.В этой главе вы будете исследовать справочную целостность более подробно ивыясним все относительно ограничений, которые вы можете использовать, чтобы ееподдерживать. Вы также увидете, как предписывается это ограничение, когда вы используете команды модификации DML. Поскольку справочная целостность включает всебя связь полей или групп полей, часто в разных таблицах, это действие может бытьнесколько сложнее, чем другие ограничения.
По этой причине, хорошо иметь с нейполное знакомство, даже если вы не планируете создавать таблицы. Ваши командымодификации могут стать эффективнее с помощью ограничения справочной целостности (как и с помощью других ограничений, но ограничение справочной целостностиможет воздействовать на другие таблицы кроме тех, в которых оно определено), аопределенные функции запроса, такие как обьединения, являются многократно структурированы в терминах связей справочной целостности (как подчеркивалось в Главе8).ВНЕШНИЙ КЛЮЧ И РОДИТЕЛЬСКИЙ КЛЮЧКогда все значения в одном поле таблицы представлены в поле другой таблицы,мы говорим что первое поле ссылается на второе. Это указывает на прямую связьмежду значениями двух полей.
Например, каждый из заказчиков в таблице Заказчиковимеет поле snum которое указывает на продавца назначенного в таблице Продавцов.Для каждого порядка в таблице Порядков, имеется один и только этот продавец иодин и только этот заказчик. Это отображается с помощью полей snum и cnum в таблице Порядков.Когда одно поле в таблице ссылается на другое, оно называется — внешнимключом; а поле на которое оно ссылается, называется — родительским ключом. Такчто поле snum таблицы Заказчиков — это внешний ключ, а поле snum на которое оноссылается в таблице Продавцов — это родительский ключ.Аналогично, поля cnum и snum таблицы Порядков — это внешние ключи, которые ссылаются к их родительским ключам с именами в таблице Заказчиков и таблицеПродавцов.
Имена внешнего ключа и родительского ключа не обязательно должныбыть одинаковыми, это — только соглашение которому мы следуем чтобы делать соединение более понятным.МНОГО-СТОЛБЦОВЫЕ ВНЕШНИЕ КЛЮЧИВ действительности, внешний ключ не обязательно состоит только из одного поля. Подобно первичному ключу, внешний ключ может иметь любое число полей, которые все обрабатываются как единый модуль. Внешний ключ и родительский ключ, накоторый он ссылается, конечно же, должны иметь одинаковый номер и тип поля, и находиться в одинаковом порядке.
Внешние ключи, состоящие из одного поля — те чтомы использовали исключительно в наших типовых таблицах, наиболее общие.Чтобы сохранить простоту нашего обсуждения, мы будем часто говорить овнешнем ключе как об одиночном столбце. Это не случайно. Если это не отметить,любой скажет о поле, которое является внешним ключом, что оно также относится и кгруппе полей, которая является внешним ключом.СМЫСЛ ВНЕШНЕГО И РОДИТЕЛЬСКОГО КЛЮЧЕЙКогда поле является внешним ключом, оно определеным образом связано стаблицей, на которую он ссылается.
Вы, фактически, говорите — "каждое значение вэтом поле (внешнем ключе) непосредственно привязано к значению в другом поле(родительском ключе)." Каждое значение (каждая строка) внешнего ключа должнонедвусмысленно ссылаться к одному и только этому значению (строке) родительскогоключа. Если это так, то фактически ваша система, как говорится, будет в состояниисправочной целостности.Вы можете увидеть это на примере. Внешний ключ snum в таблице Заказчиковимеет значение 1001 для строк Hoffman и Clemens.Предположим, что мы имели две строки в таблице Продавцов со значением вполе snum = 1001.Как мы узнаем, к которому из двух продавцов были назначены заказчики Hoffmanи Clemens? Аналогично, если нет никаких таких строк в таблице Продавцов, мы получим Hoffman и Clemens назначенными к продавцу, которого не существует!Понятно, что каждое значение во внешнем ключе должно быть представленоодин, и только один раз, в родительском ключе.Фактически, данное значение внешнего ключа может ссылаться только к одномузначению родительского ключа не предполагая обратной возможности: т.е.
любоечисло внешних ключей может ссылать к единственному значению родительского ключа. Вы можете увидеть это в типовых таблицах наших примеров. И Hoffman и Clemensназначены к Peel, так что оба их значения внешнего ключа совпадают с одним и темже родительским ключом, что очень хорошо. Значение внешнего ключа должно ссылаться только к одному значению родительского ключа, зато значение родительскогоключа может ссылаться с помощью любого колличества значений внешнего ключа.В качестве иллюстрации, значения внешнего ключа из таблицы Заказчиков, совпавшие с их родительским ключом в Продавцов таблице, показываются в Рисунке19.1. Для удобства мы не учитывали поля, не относящиеся к этому примеру.ОГРАНИЧЕНИЕ FOREIGN KEYSQL поддерживает справочную целостность с ограничением FOREIGN KEY.
Хотя ограничение FOREIGN KEY — это новая особенность в SQL, оно еще не обеспечивает его универсальности. Кроме того, некоторые его реализации более сложны чемдругие. Эта функция должна ограничивать значения, которые вы можете ввести в вашу базу данных, чтобы заставить внешний ключ и родительский ключ соответствоватьпринципу справочной целостности.Одно из действий ограничения Внешнего Ключа — это отбрасывание значенийдля полей, ограниченных как внешний ключ, который еще не представлен в родительском ключе.
Это ограничение также воздействует на вашу способность изменять илиудалять значения родительского ключа (мы будем обсуждать это позже в этой главе).КАК МОЖНО ПОЛЯ ПРЕДСТАВИТЬ В КАЧЕСТВЕВНЕШНИХ КЛЮЧЕЙВы используете ограничение FOREIGN KEY в команде CREATE TABLE (илиALTER TABLE), которая содержит поле которое вы хотите обьявить внешним ключом.Вы даете имя родительскому ключу, на которое вы будете ссылаться внутри ограничения FOREIGN KEY. Помещение этого ограничения в команду — такое же, что длядругих ограничений, обсужденных в предыдущей главе.Таблица Продавцовcnumcnamesnum2001 Hoffman10012002 Giovanni 10032003 Liu10022004 Grass10022006 Clemens10012008 Cisneros 10072007 Periera1004Таблица Заказчиковsnumsnamecomm1001 Peel.121002 Serres.131004 Notika.111007 Rifkin.151003 Axelrod.10Рисунок 19.1: Внешний Ключ таблицы Заказчиков с родительским ключомПодобно большинству ограничений, оно может быть ограничением таблицы илистолбца, в форме таблицы позволяющей использовать многочисленые поля как одинвнешний ключ.ВНЕШНИЙ КЛЮЧ КАК ОГРАНИЧЕНИЕ ТАБЛИЦЫСинтаксис ограничения таблицы FOREIGN KEY:FOREIGN KEY <column list> REFERENCES <pktable> [ <column list> ]Первый список столбцов — это список из одного или более столбцов таблицы,которые отделены запятыми и будут созданы или изменены этой командой.
Pktable —это таблица содержащая родительский ключ. Она может быть таблицей, которая создается или изменяется текущей командой. Второй список столбцов — это списокстолбцов которые будут составлять родительский ключ. Списки двух столбцов должныбыть совместимы, т.е.:* Они должны иметь одинаковое число столбцов.* В данной последовательности, первый, второй, третий, и т.д., столбцы спискастолбцов внешнего ключа, должны иметь одинаковые типы данных и размеры, что ипервый, второй, третий, и т.д., столбцы списка столбцов родительского ключа. Столбцы в списках обоих столбцов не должны иметь одинаковых имен, хотя мы и использовали такой способ в наших примерах чтобы делать связь более понятной.Создадим таблицу Заказчиков с полем snum определенным в качестве внешнегоключа ссылающегося на таблицу Продавцов:CREATE TABLE Customers(cnum integer NOT NULL PRIMARY KEYcname char(10),city char(10),snum integer,FOREIGN KEY (snum) REFERENCES Salespeople (snum));Имейте в виду, что при использовании ALTER TABLE вместо CREATE TABLE,для применения ограничения FOREIGN KEY, значения которые Вы указываете вовнешнем ключе и родительском ключе, должны быть в состоянии справочной целостности.
Иначе команда будет отклонена. Хотя ALTER TABLE очень полезна из-за ееудобства, вы должны будете в вашей системе, по возможности каждый раз, сначалаформировать структурные принципы, типа справочной целостности.ВНЕШНИЙ КЛЮЧ КАК ОГРАНИЧЕНИЕ СТОЛБЦОВВариант ограничения столбца ограничением FOREIGN KEY — по другому называется — ссылочное ограничение (REFERENCES), так как он фактически не содержитв себе слов FOREIGN KEY, а просто использует слово REFERENCES, и далее имяродительского ключа, подобно этому:CREATE(cnumcnamecitysnumTABLE Customersinteger NOT NULL PRIMARY KEY,char(10),char(10),integer REFERENCES Salespeople (snum));Вышеупомянутое определяет Customers.snum как внешний ключ у которого родительский ключ — это Salespeople.snum. Это эквивалентно такому ограничениютаблицы:FOREIGN KEY (snum) REGERENCES Salespeople (snum)НЕ УКАЗЫВАТЬ СПИСОК СТОЛБЦОВ ПЕРВИЧНЫХКЛЮЧЕЙИспользуя ограничение FOREIGN KEY таблицы или столбца, вы можете не указывать список столбцов родительского ключа если родительский ключ имеет ограничение PRIMARY KEY.
Естественно, в случае ключей со многими полями, порядокстолбцов во внешних и первичных ключах должен совпадать, и, в любом случае,принцип совместимости между двумя ключами все еще применим. Например, еслимы поместили ограничение PRIMARY KEY в поле snum таблицы Продавцов, мы моглибы использовать его как внешний ключ в таблице Заказчиков (подобно предыдущемупримеру) в этой команде:CREATE(cnumcnamecitysnumTABLE Customersinteger NOT NULL PRIMARY KEY,char(10),char(10),integer REFERENCES Salespeople);Это средство встраивалось в язык, чтобы поощрять вас использовать первичныеключи в качестве родительских ключей.КАК СПРАВОЧНАЯ ЦЕЛОСТНОСТЬ ОГРАНИЧИВАЕТЗНАЧЕНИЯ РОДИТЕЛЬСКОГО КЛЮЧАПоддержание справочной целостности требует некоторых ограничений на значения, которые могут быть представлены в полях, обьявленных как внешний ключ иродительский ключ.