Программирование баз данных MS SQL Server (1084479), страница 55
Текст из файла (страница 55)
В''ИКП)ЗЙМЕЬЙЕЙ)гй:ЙЕт,,'ОСОООГПСК)ЬЮСЛЕ ЕВСЛс'И'.РЕЧЬ",ИДЕТ 'ЛИШЬОСтОМ!'ЧтобЫССЙРЕДССтаь 'вить:,пользейетйла.'седеряимдв Некоторой;тебййцы,6-'дейсувительнсьс) й несбкодимйсть В-,ИСЛОЛЬЗОВаИИИ,'ИДЕИтИфйКЗЕтто))СВ40)0 ВОЕЙИ)СЕЕт'ЛИЩЬ;.В"тОМ'=ШИРОКсО,ИЗВЕСтйби,:.СЛУЧДЕЕ Косейй'СОЗДА(9(Г СРЕДВ баЕЫД~ННЫХ:С) тИРЕ)КИ)ЗУЕМЫМЙ "ИП~И~Н МИЗйасйИЗЫМИ:-'В;ЙедосбйЬСХ:СЛувВЙХ,ЙЙВСВМОжНО:отбой)гдов,66Е;,ПрИМНЕНЕИйпидЗЕИФИФИКатерпкс 60)(З;))ЛЙ,:СНЕЗ)ёйИВСЛЕсраиуйОЗЕ КЛЮЙВ. 218 Глава 6 Таблица может иметь не больше одного первичного ключа. Кроме того, как уже было сказано выше, в базе данных редко встречаются такие таблицы, для которых не требуется первичный ключ.
Следует нодье)зкнуть вьгсхозанную выше мысль, отметив, что таблицы без первичного ключа встречаются не просто редко, а очень редко. Наличии в базе данных таблицы, не имею. щей первичного ключа, полностью пРотивофечит пРедставлениямоРееяционном хаРактере данных, хуганимых в базе данных, поскольку из этого следует, что возможность установить связь с какой-либо конкретной строкой этой таблицы отсутствуета Данные, предапавленные в табзице, не илюющей первичного ключа, не имеют также какихлибо отличительнь х и~пи н оков.
Безусвовно, нередко встречаютсч ситуации, в копизрых многочисленные строки таблицылогически идентичны фуг другу, но это не означает, что вазможность создания пеузвичного ключа для такой таблицы отсутствуеоь В подобнсчх обапоятиаяьствах может быть предусмотрено искусственное создание ключа того или иного типа. Г1одобный подход чаще всего реализуется с использованием столбца идентификации, но в пехота)зых ситуациях в больиий степени оправдано применение идентификаторов СС7((3. Первичный ключ гарантирует уникальность сочетания значений столбцов, объявленных как принадлежащие к этому первичному ключу. Сами эти уникальные значения служат в качестве идентификаторов для каждой строки в таблице. Для создания первичного ключа по существу применяются два способа.
Первичный ключ может быть либо создан с помощью команды СКЕАТЕ ТАВЬЕ во время создания таблицы, либо введен в действие впоследствии с помощью команды АЬТЕК ТАВЬЕ. Создание первичного ключа при создании таблицы Рассмотрим один из операторов СКЕАТЕ ТАВ1,Е, приведенных в предыдущей главе: Читатель уже должен быть хорошо знаком с подобными операторами СКЕАТЕ, а теперь введем в него очень важную часть — ограничение РКХЫАКу КЕу. В качестве первичного ключа обозначим столбец СнясотетМо.
Подробное описание критериев выбора наиболее подходящих первичных ключей приведено в следующей главе, а на данный момент отметим, что решение по выбору столбца снясотетмо может быть обосновано хотя бы тем, что необходимо обеспечить уникальность значений идентификаторов заказчиков в столбце Сняготегно. Подобные системы, в которых для каждого из обслуживаемых заказчиков предусмотрен уникальный идентификатор, эксплуатируются уже много лет, поэтому нет смысла снова изобретать это колесо. СКЕАТЕ ТАВЬЕ Снятопетя ( Снятопетно Снятопетна~е Ас(атеяя1 Ас(агеяя2 Сйту этапа 21Р спптасг.
Рпопе Реа10но Оате1пзуятеп ) Тпт 1ОЕМТ1ТУ чагспаг(30) чагсьат(30) чагспаг(30) чатспат(20) спас(2) чагспаг(10) натопят(25) спас(15) натопят(9) япа11нагег1пе Мот МОЬЬ, мот мпы., МОТ МОЬ1, МОТ МОЬЬ, МОТ МОЬЬ, МОТ МОЬЬ, МОТ МОЬ1, МОТ МОЬЬ, МОТ МОЬЬ, МОТ МОЬЬ, МОТ МОЬЬ Ограничения 219 Чтобы внести корректировку в рассматриваемый оператор СВЕАТЕ ТАВЬЕ для задания в нем ограничения РВТМАВХ КЕХ, достаточно ввести информацию об ограничении сразу после определения столбца (столбцов), который должен войти в состав первичного ключа. В данном случае достаточно задать ключевое слово РВ1Р)АВу КЕу: 1ОЕМТ1ТУ МОТ МОЬЬ Следует отметить, что для проверки этого кода необходимо вначале удалить существующую таблицу с помощью команды ОВОР тАВье спясоветя.
Кроме того, внесенные в оператор изменения сводятся к тому, что модифицирована одна строка (удалена запятая в конце) и добавлен неболыпой объем кода во вторую строку, относящуюся к этому столбцу. Иными словами, доработка оказалась несложной! Еще раз отметим, что все изменение свелось к добавлению одного простого ключевого слова (разумеется, оно складывается из двух слов, но они рассматриваются как одно ключевое слово), после чего таблица стала обладать первичным ключом.
Создание первичного ключа на существующей таблице Кроме объявления таблицы с первичным ключом, предусмотрена возможность создания первичного ключа на существутощей таблице. Это — также несложная задача. Рассмотрим, как она решается, на примере таблицы Евр1оуеея: ОЯЕ Ассоипт1пд АЬТЕВ ТАВЬЕ Евр1оуеея АОР СОМЯТВА1МТ РК Евр1оуее10 РВТМАВУ КЕХ (Евр1пуее10) Ниже описано, какие сведения передаются в СУБД Б(1ь в рассматриваемой команде АЬТЕР С) Указание на то, что должно быть сделано дополнение к определению таблицы (при желании можно было бы также исключить какую-то часть существующего определения таблицы). С) Уточнение дополняемой части определения (согласно которому вводится о1раничение).
С) Имя, предусмотренное для ограничения (которое позволит в дальнейшем непосредственно обращаться к ограничению). С) Тип ограничения (РВ1)(АВХ КЕХ). С) Столбец (столбцы), на который распространяется ограничение. СВЕАТЕ ТАВЬЕ Спятоветя Спятоветно 1пт РР1МАРУ КЕХ, СпятоветМаве чатсьат(30) АсЫтеяя1 чагспаг(30) Ас(птеяя2 чятсьат(30) Стту чатсьат(20) Ятате сьят (2) 2ьр чатсьат(10) Соптаст чатсьат(25) Рьопе пьат(15) Рет(1ОМо чатсьат(9) Рате1пЯуятев ява11пятет1ве МОТ МОЬЬ, МОТ МОХЬ, МОТ МОЬЬ, МОТ МОЬЬ, МОТ МОЬЬ, МОТ МОЬЬ, МОТ МОЬЬ, МОТ МОЬЬ, МОТ МОЬ(, МОТ МОЬЬ 220 Глава 6 Ограничения говжпж кжт Внешние ключи не только обеспечивают целостность данных, но и создают связи между таблицами.
После задания внешнего ключа на таблице устанавливается зависимость между таблицей, для которой определяется внешний ключ (так называемой ссылающейся таблицей), и таблицей, на которую ссылается внешний ключ (так называемой таблицей, упомянутой в ссылке). После задания на ссылающейся таблице внешнего ключа любая строка, вставляемая в эту таблицу, должна соответствовать одному из следующих двух условий: иметь согласующуюся с ней строку в столбце (столбцах), которому соответствует внешний ключ таблицы, указанной в ссылке, или иметь значение столбца (столбцов) внешнего ключа, равное МОЬЬ. Такое определение может показаться немного запутанным, поэтому рассмотрим, как оно применяется на примере.
В пргдыдугцем пРедлоясеяии сгова "шиеть значение Ровное МОЬЬ ", указывают на то, что фактическии должен содержсояь опе)гатоР 1МЯЕВ Т, п)псменяемый к ссылаюгцгв1ся таблице. Как оудет васоре описано, в действительности зти данные после ввода в таолицу могут выглядеть немного иначе, в зависимотяи от того, какие опции заданы в оогявлении ЕОВЕХОТУ КЕУ. Создадим в базе данных Ассоппс1пд еще одну таблицу и назовем ее Огбегз. В приведенном ниже сценарии с оператором СРЕАТЕ заслуживает внимания то, что в таблицах предусмотрено применение и первичного, и внешнего ключа. Из дальнейшего описания рассматриваемого проекта станет ясно, что существенно важной частью объявления одной из таблиц является спецификация первичного ключа. С другой стороны, объявление внешнего ключа, который задается на таблице в этом сценарии, почти полностью совпадает с объявлением первичного ключа, не считая того, что в этом объявлении указана таблица, на которую ссылается внешний ключ.
Синтаксическая структура объявления внешнего ключа предусматривает необходимость указания столбца или столбцов, на которые распространяется ограничение ЕОВЕХОМ КЕУ, и выглядит примерно таким образом: <со1пвп паве> <баса туре> <пп11аЬ111ьу> РОВЕТЯМ КЕу ВЕРЕКЕМСЕЯ <Ьаь1е паве>(<со1пвп паве>) [ОМ ОЕЬЕТЕ (САЯСАОЕ)МО АСТ1ОМ(ЯЕТ МОЬЬ(ЯЕТ ОЕРАОЬТ)) (ОМ ОРОАТЕ (САЯСАОЕ)МО АСТТОМ)ЯЕТ МОЬЬ(ЯЕТ ОЕРАОЬТ)) Создание таблицы с внешним ключом При выполнении этого задания не предусмотрено использование конструкции ОМ.
Таким образом, применительно к таблице Огбегз может быть подготовлен сценарий, который выглядит, как показано ниже. ОЯЕ Ассоппь1пц СВЕАТЕ ТАВЬЕ Осбесз ( Осбес1О Ьпь 1ОЕМТХТТ МОТ МПЬЬ РК1МАВУ КЕУ, Спзссвегно Тпь МОТ МОЬЬ РОВЕ1ОМ КЕу ВЕРЕКЕМСЕЯ Спзсовесо(спзсовегно), Осбегоаье зва11баьеь1ве МОТ МОЬЬ, Евр1оуее10 Тпс МОТ МОЬЬ ) Ограничения 221 Следует учитывать, что столбец, на который фактически ссылается внешний ключ, должен иметь определенное на нем ограничение РК1МАК1 КЕ1 или УЫ1ЯОЕ (ограничения УМ1ЯОЕ описаны ниже в данной главе).
Следует также отметить, что на одном и том же апаабце могут быть заданы одновРеменно и пеРвичный, и внешний ключ. 1УРимеР такого пРмменения ключго1 можно видеть в таблице Огрех вега11з базы данных НогСЛндпд. В втой таблице пеРвичный ключ состоит из еталбцов Огс1ег10 и Ргог)ос С 1Р, а на обоих этих столбцах заданы также внпание ключи, хопгоРые ссылаются соответственно на таблицы Огс1егз и Ргос1пс С з. В настоящей главе также будет фактически создана табгица, имеющая столбец, на кот<фон заданы одновременно и первичный и внеганий ключ. Описание полученньзл результатов После успешного применения приведенного выше кода вызовите на выполнение процедуру зр пе1р. После этого должно быть обнаружено, что в разделе сопзгга1пгэ тех результатов, которые получены с помощью процедуры зр Пе1р, будет содержаться информация о новом ограничении.
Кроме того, для получения еще более подробных сведений об имеющихся ограничениях можно вызвать на выполнение процедуру эр Ье1рсопзггайпС, которая также имеет простой синтаксис ЕХЕС ар Ье1рсопзггаьпь <СаЫе паве> После применения процедуры зр Пе1рсопзггайпг к вновь созданной таблице Огдегэ будет получена информация, позволяющая узнать имена, условия и состояние всех ограничений, заданных на этой таблице.
Очевидно, что на данном этапе таблица Огдегз имеет одно ограничение ГОКЕ16н КЕУ и одно ограничение РК1МАКУ КЕ1. Итак, определение внешнего ключа было задано непосредственно в объявлении таблицы. Таким образом, после создания этой таблицы внешний ключ становится ее неотъемлемой частью.