Чтобы реализовать в базе данных VetLab идею ключей, при создании таблицы можно сразу указывать ее первичный ключ. В следующем примере будет достаточно одного столбца (при условии, что у фирм-клиентов VetLab разные названия):
CREATE TABLE CLIENT ( | ||
ClientName | CHARACTER (30), | PRIMARY KEY, |
Address1 | CHARACTER (30), | |
Address2 | CHARACTER (30), | |
City | CHARACTER (25), | |
State | CHARACTER (2), | |
PostalCode | CHARACTER (10), | |
Phone | CHARACTER (13), | |
Fax | CHARACTER (13), | |
ContactPerson | CHARACTER (30) ) ; |
Здесь ограничение NOT NULL (не может быть неопределенным значением), которое было в предыдущем определении таблицы CLIENT, заменено другим ограничением — PRIMARY KEY (первичный ключ). Второе ограничение подразумевает первое, потому что первичный ключ не может иметь неопределенное значение.
Несмотря на то что большинство СУБД позволяет создавать таблицу без единого ключа, важно помнить, что все таблицы базы данных должны иметь первичный ключ. Поэтому нужно ввести ограничение NOT NULL в таблицы TESTS, EMPLOYEE, ORDERS и RESULTS вместе с ограничением PRIMARY KEY, как показано в следующем примере:
CREATE TABLE TESTS (
TestName CHARACTER (30) PRIMARY KEY,
StandardCharge CHARACTER (30) ) ;
Иногда в таблице ни один единичный столбец не может гарантировать уникальность строки. В таких случаях можно использовать составной ключ. Он является сочетанием столбцов, совместное использование которых гарантирует уникальность. Представьте, что некоторые клиенты VetLab — это фирмы, имеющие свои отделения в нескольких городах. В таком случае поля ClientName будет недостаточно, чтобы различить два разных отделения одного и того же клиента. Чтобы решить эту проблему, можно определить следующий составной ключ:
CREATE TABLE CLIENT ( | ||
ClientName | CHARACTER (30), | PRIMARY KEY, |
Address1 | CHARACTER (30), | |
Address2 | CHARACTER (30), | |
City | CHARACTER (25), | PRIMARY KEY, |
State | CHARACTER (2), | |
PostalCode | CHARACTER (10), | |
Phone | CHARACTER (13), | |
Fax | CHARACTER (13), | |
ContactPerson | CHARACTER (30) ) ; |
Внешние ключи
Внешний ключ — это столбец или группа столбцов в таблице, соответствующие первичному ключу (т.е. ссылающиеся на первичный ключ) из другой таблицы базы данных. Внешний ключ сам по себе может и не быгь уникальным, но должен однозначно называть столбец в той таблице, на которую он ссылается.
Если столбец ClientName — это первичный ключ таблицы CLIENT, то каждая строка этой таблицы должна иметь в столбце ClientName уникальное значение. В свою очередь, в таблице ORDERS ClientName является внешним ключом. Этот внешний ключ соответствует первичному ключу таблицы CLIENT, но в таблице ORDERS он может и не быть уникальным. На самом деле вы, конечно же, надеетесь, что внешний ключ не является уникальным. Ведь если бы каждая из фирм ваших клиентов сделала у вас только один заказ и больше этого не повторяла, то ваш бизнес довольно быстро бы прекратился. На самом деле вы надеетесь, что каждой строке таблицы CLIENT соответствует много строк таблицы ORDERS, показывая этим, что почти все ваши клиенты постоянно пользуются вашими услугами.
Следующее определение таблицы ORDERS показывает, каким образом в операторе CREATE можно задавать внешние ключи:
CREATE TABLE ORDERS ( | ||
OrderNumber | INTEGER | NOT NULL, |
ClientName | CHARACTER (30), | |
TestOrdered | CHARACTER (30), | |
Salesperson | CHARACTER (30), | |
OrderDate | DATE ) ; | |
CONSTRAINT BRANCHFK FOREIGN KEY (ClientName) | ||
REFERENCES CLIENT (ClientName), | ||
CONSTRAINT TestFK FOREIGN KEY (TestOrdered) | ||
REFERENCES TESTS (TestName), | ||
CONSTRAINT SalesFK FOREIGN KEY (Salesperson) | ||
REFERENCES EMPLOYEE (EmployeeName),) ; |
Внешние ключи таблицы ORDERS связывают ее с первичными ключами таблиц CLIENT, TESTS и EMPLOYEE.