Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции по бд.doc
Скачиваний:
0
Добавлен:
24.02.2020
Размер:
4.79 Mб
Скачать

Внешние ключи

Внешний ключ (foreign key) – это столбец в дочерней таблице, ссылающий на ключ родительской таблицы. Использование внешних ключей является основным механизмом поддержания ссылочной целостности внутри реляционной базы данных. Столбец, назначенный внешним ключом, используется для ссылок на столбец, определенный как ключ в другой таблице. Рассмотрим пример создания внешнего ключа.

CREATE TABLE EMPLOYEE_PAY_TBL (

EMP_ID CHAR(9) NOT NULL,

POSITION VARCHAP(15) NOT NULL,

DATE_HIRE DATE NULL,

PAY_RATE NUMBER(4,2) NOT NULL,

DATE_LAST_RAISE DATE NULL,

CONSTRAINT EMP_ID_FK FOREIGN KEY (EMP_ID) REFERENCES EMPLOYEE_TBL (EMP_ID);

Столбец EMP_ID в этом примере назначается внешним ключом таблицы EMPLOYEE PAY_TBL. Этот внешний ключ ссылается на столбец EMP_ID таблицы EMPLOYEE_TBL. Наличие внешнего ключа гарантирует, что для, каждого значения ЕМР ID в таблице EMFLOYEE_PAY_TBL найдется соответствующее значение EMP_ID в таблице EMPLOYEE_TBL. Такую связь называют родителъско-дочерним отношением. Родительской таблицей является таблица EMPLOYEE_TBL, а дочерней – EMPLOYEE_PAY_TBL. Чтобы лучше понять суть родительско-дочерних отношений между таблицами, рассмотрите рис. 3.2.

На этом рисунке столбец EMP_ID дочерней таблицы ссылается на столбец EMP_ID родительской таблицы. Некоторое значение можно будет ввести в столбец EMP_ID дочерней таблицы только тогда, когда такое же значение существует в столбце EMP_ID родительской таблицы. Точно так же некоторое значение можно будет удалить из столбца EMP_ID родительской таблицы только тогда, когда все соответствующие значения уже удалены из столбца EMP_ID дочерней таблицы. Так осуществляется ссылочная целостность.

Внешний ключ можно назначить таблице с помощью команды ALTER TABLE, как показано в следующем примере.

ALTER TABLE EMPLOYEE_PAY_TBL

ADD CONSTRAINT ID_FK FOREIGN KEY (EMP_ID) REFERENCES EMPLOYEE_TBL (EMP_ID);

В разных реализациях SQL команда ALTER TABLE имеет разные опции – это, в частности, относится и к опциям, задающим ограничивающие условия. Кроме того, варьируются сама форма задания ограничений, но лежащая в ее основе концепция ссылочной целостности должна быть неизменной для всех реляционных баз данных.

Рис. 3.2 Родительско-дочерние отношения между таблицами

Атрибут not null

В предыдущих примерах ключевые слова NULL и NOT NULL использовались во всех строках с определениями столбцов после указания типа данных. Атрибут NOT NULL – это ограничение, которое можно назначить столбцу в таблице. Это ограничение не позволяет оставлять столбцы пустыми. Другими словами, для столбца, помеченного как NOT NULL, требуется наличие данных во всех строках таблицы. Если атрибут NOT NULL не назначен для столбца, для такого столбца значением по умолчанию обычно является NULL, что позволяет иметь пустые значения в столбце.

Использование условий проверки

Условия проверки можно использовать для проверки правильности вводимых в столбец данных. Условия проверки используются для организации редактирования данных в базе данных на нижнем уровне, хотя довольно часто редактирование данных бывает организовано на уровне приложений. Вообще говоря, обычно при редактировании имеются ограничения на вводимые в таблицы или другие объекты данные, или на уровне самой базы данных или на уровне приложения, доступного пользователю. Условия проверки обеспечивают дополнительный уровень защиты данных.

Использование условий проверки показано в следующем примере.

CREATE TABLE EMPLOYEE_TBL (

EMP_ID CHAR(9) NOT NULL,

EMP_NAME VARCHAR(40) NOT NULL,

EMP_ST_ADDR VARCHAR(20) NOT NULL,

EMP_CITY VARCHAR(15) NOT NULL,

EMP_ST CHAR(2) NOT NULL,

EMP_ZIP NUMBER(5) NOT NULL,

EMP_PHONE NUMBER(10) NULL,

EMP_PAGER NUMBER(10) NULL,

PRIMARY KEY (EMP_ID),

CONSTRAINT CHK_EMP_ZIP CHECK (EMP_ZIP = '46234'));

В этом примере условия проверки назначены столбцу EMP_ZIP и состоят в том, чтобы у всех служащих из этой таблицы был ZIP-код равный '46234'. Наверное, это слишком строгое ограничение, но зато вы можете видеть, как оно работает.

Если нужно использовать условия проверки для того, чтобы допустить ZIP-коды только из определенного набора значений, условие может выглядеть так:

CONSTRAINT CHK_EMP_ZIP CHECK (EMP_ZIP IN ('46234', '46227', '46745'));

Если имеется минимальный уровень оплаты труда, который должен быть обеспечен служащему, можно указать следующие условия:

CREATE TABLE EMPLOYEE_PAY_TBL

(EMP_ID CHAR(9) NOT NULL,

POSITION VARCHAR(15) NOT NULL,

DATE_HIRE DATE NULL,

PAY_RATE NUMBER(4,2) NOT NULL,

DATE_LAST_RAISE DATE NULL,

CONSTRAINT EMP_ID_FK FOREIGN KEY (EMP_ID) REFERENCES EMPLOYEE_TBL (EMP_ID),

CONSTRAINT CHK_PAY CHECK (PAY_RATE > 12.50 ));

В данном примере любому из служащих, информация о которых заносится в таблицу, необходимо назначить плату более $12,50 в час. Для условий проверки можно использовать практически любые условия, допустимые для запросов SQL. В ходе дальнейшего чтения такие условиях будут обсуждаться подробнее.