|
Программирование >> Программирование баз данных
Следует также отметить, что на одном и тюм же столбце могут быть заданы одновременно и первичный, и внешний ключи. Пример таблицы, в которой имеется столбец, выполняющий одновременно функции первичного ключа и внешнего ключа, приведен в одном из следующих разделов данной главы. После успешного применения приведенного выше кода вызовите на выполнение процедуру sp help. После этого должно бьггь обнаружено, что в разделе constraints тех результатов, которые получены с помощью процедуры sp help, будет содержаться информация о новом ограничении. Кроме того, для получения еще более подробных сведений об имеющихся ограничениях можно вызвать на вьшолнение процедуру sp helpconstraint, которая также имеет простой синтаксис: EXEC sp helpconstraint <table name> После применения процедуры sp helpconstraint к вновь созданной таблице Orders будет получена информация, позволяющая узнать имена, условия и состояние всех ограничений, заданных на этой таблице. Очевидно, что на данном этапе таблица Orders имеет одно ограничение FOREIGN KEY и одно ограничение PRIMARY KEY. В результатах применения процедуры sp helpconstraint к рассматриваемой таблице можно обнаружить слово (clustered) непосредственно после сведений об ограничении PRIMARY KEY. Это слово просто означает, что данный рщцекс является кластеризованным. Смысл этого понятия будет раскрыт более подробно в главе 8. Определение внешнего ключа было задано непосредственно в объявлении таблицы. Таким образом, после создания этой таблицы внешний ключ становится ее неотъемлемой частью. Как было указано в главе 1, поддержание собственной целостности должна обеспечивать сама база данных. Каждый внешний ключ принудительно вводит одно из ограничений, распространяющихся на хранимые данные, и поэтому гарантирует обеспечение целостности базы данных. В отличие от первичных ключей, количество внешних ютючей, заданных на таблице, не должно ограничиваться только одним. Для любой таблицы может быть задано от нуля до 253 внешних ключей. Единственным условием является то, что каждый конкретный столбец может упоминаться только в одном внешнем ключе. Тем не менее в каждом отдельном внешнем ключе может быть задано несколько столбцов. Кроме того, предусмотрена возможность использовать какой-то конкретный столбец в качестве назначения ссылок, заданных во внешних ключах многих таблиц. Добавление внешнего ключа к существующей таблице На практике иногда возникают ситуации, когда требуется дополнительно задать на таблице не только первичный ключ, но и какие-либо другие ограничения, в том числе внешние ключи. Для этого применяется процедура, аналогичная созданию первичного ключа. Зададим еще один внешний ключ на таблице Orders, чтобы обеспечить ввод в поле EmployeelD (предназначенное для хранения идентификаторов служащих, которые вводят заказы) только действительных данных о служащих, которые определены в таблице Employees. Для этого необходимо предусмотреть уникальную вдентифи-кацию целевой строки в таблице, указанной в ссылке. 1Сак уже было отмечено выше, этой цели можно достичь, ссылаясь либо на первичный ключ, либо на столбец с ограничением UNIQUE. В данном случае воспользуемся существующим первичным ключом, который был задан на таблице Employees в одном из примеров, приведенных выше в настоящей главе, следующим образом: ALTER TABLE Orders ADD CONSTRAINT FK EmployeeCreatesOrder FOREIGN KEY (EmployeelD) REFERENCES Employees(EmployeelD) После этого еще раз вызовите на выполнение процедуру sp helpconstraint применительно к таблице Orders и убедитесь в том, что новое ограничение было успешно задано. Последнее введенное в этом примере ограничение действует точно так же, как и предыдущее - регламентирует правила, применяемые к данным, вводимым в соответствующий столбец, согласно объявлению самой таблицы. Определение столбца не позволяет, например, вводить строковые данные в столбец числового типа, а ограничение не дает возможности вставлять в таблицу Orders такую строку, в которой значение поля Employee с данными о служащем, ответственным за ввод заказа, не ссылается на действительное значение EmployeelD. Если кто-то попытается ввести строку, которая не согласуется со строкой данных о служащем, такая операция вставки в таблицу Orders будет отвергнута в целях обеспечения целостности базы данных. Обратите внимание на то, что даже после задания двух внешних ключей в последней части результатов выполнения процедуры sp helpconstraint (или вкладки Messages, eaiu выбрана опция Results In Grid) по-прежнему появляется строка со аювами No foreign keys reference this table . Данное сообщение свидетельствует о том, что в базе данных отсутствуют какие-либо другие таблицы, ссылающиеся на данную таблицу, хотя в самой этой таблице имеются внешние, ключи, ссылающиеся на другие таблицы. Чтобы убедиться в том, что в базе данных учитывается различие между ссылающимися таблицами и таблицами, указанными в ссылке, вызовюпе на данном этапе процедуру sp helpconstraint применительно к таблице Customers или Employees и убедитесь в том, что для каждой из этих таблиц указано, что на нее ссылается новая таблица Orders. Создание таблицы, ссылающейся на саму себя Иногда возникает необходимость задать в ограничении столбец, находящийся не в другой таблице, а непосредственно в той же таблице, в которой создается ссылка на исходное ограничение. Интерес представляет вопрос, может ли одна и та же таблица быть одновременно ссылающейся и указанной в ссылке. Рассмотрим эту тему более подробно. Разумеется, подобные ситуации встречаются не очень часто, но достаточно регулярно. Прежде чем действительно будет создано подобное ссылающееся на самого себя ограничение целостности, в котором указано обязательное поле (не допускающее NULL-значения), основанное на столбце идентификации, необходимо поместить в таблицу по крайней мере одну строку еще до добавления внешнего ключа. Рассмотрим, с чем связана эта необходимость. Такое требование обусловлено тем, что идентификационное значение выбирается и заполняется после того, как уже была ос)тцествле-на проверка внешнего ключа и принудительно введено заданное в нем ограничение. Это означает, что при отсутствии строк в таблице еще отсутствует значение, на которое могла бы указывать ссылка из первой строки при проведении проверки. Из этой ситуации есть также еще один выход - начать с создания требуемого внешнего ключа, а затем запретить его использование при вводе первой строки. Дополнительные сведения о том, как можно отменить использование ограничений, приведены ниже в этой главе. Итак, в данном случае рассматривается таблица, в которой имеется ссылка на столбец, представляющий собой столбец идентификации, поэтому необходимо вначале ввести в таблицу хотя бы одну первичную строку и только после этого задавать ограничение: INSERT INTO Employees ( FirstName, LastName, Title, SSN, Salary, PriorSalary, HireDate, ManagerEmpID, Department VALUES ( Billy Bob, Boson, Head Cook & Bottle Washer, 123-45-6789 r 100000, 80000, 1990-01-01, 1, Cooking and Bottling ) Теперь, после ввода первичной строки, можно приступить к заданию внешнего ключа. В этом варианте создания таблицы, ссылающейся на саму себя, в котором используется оператор ALTER, осуществляемые действия аналогичны тем, которые выполняются при уточнении любого другого определения внешнего ключа. Проверим действие следующего оператора на практике: ALTER TABLE Employees ADD CONSTRAINT FK EmployeeHasManager FOREIGN KEY (ManagerEmpID) REFERENCES Employees(EmployeelD) В данном операторе есть только одно отличие от оператора CREATE. Но заслуживает внимания еще один нюанс, состоящий в том, что в данном определении допускается не использовать ключевое слово FOREIGN KEY (но этого не след)ет делать) и оставлять только констр)тсцию REFERENCES. К этому времени таблица Employees уже определена, но если бы речь шла о ее создании с самого начала, то на данном этапе можно было бы применить следующий сценарий. (Обратите особое внимание на внешний ключ на столбце ManagerEmpID.) CREATE TABLE Employees ( EmployeelD int IDENTITY NOT NULL PRIMARY KEY, FirstName varchar (25) NOT NULL, Middlelnitial char (1) NULL, LastName varchar (25) NOT NULL, Title varchar (25) NOT NULL, SSN varchar (11) NOT NULL,
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |