В этом случае ключ задается при создании таблицы и является по своей сути ограничивающим условием. Можно задать ключ и непосредственно как ограничивающее условие, например, следующим образом.
CREATE TABLE EMPLOYEEJTBL
(EMP_ID CHAR(9) NOT NULL,
EMP_NAME VARCHAR2(40) NOT NULL,
EMP_ST_ADDR VARCHAR2(20) NOT NULL,
EMP_CITY VARCHAR2(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));
В этом примере офаничивающее условие ключа указано в операторе CREATE TABLE через запятую после определения всех столбцов таблицы.
Ключ, составленный из нескольких столбцов, можно задать одним из следующих способов.
CREATE TABLE PRODUCTS (PROD_ID VARCHAR2(10) NOT NULL,
VEND_ID VARCHAR2(10) NOT NULL,
PRODUCT VARCHAR2(30) NOT NULL,
COST NUMBER(8,2) NOT NULL, PRIMARY KEY (PROD__ID, VEND_ID));
ALTER TABLE PRODUCTS "
ADD CONSTRAINT PRODUCTS_PK PRIMARY KEY (PROD_ID, VEND_ID);
Ограничивающее
Рассмотрим следующий пример.
CREATE TABLE EMPLOYEE_TBL
(EMP_ID CHAR(9) NOT NULL PRIMARY KEY,
EMP_NAME VARCHAR2(40) NOT NULL,
EMP_ST_ADDR VARCHAR2(20) NOT NULL,
EMP_CITY VARCHAR2(15) NOT NULL,
EMP_ST CHAR(2) NOT NULL,
EMP_ZIP NUMBER(5) NOT NULL,
EMP_PHONE NUMBER(10) NULL UNIQUE,
EMP_PAGER NUMBER(IO) NULL);
Ключевым в данном примере является EMP_ID и это значит, что столбец с табельным номером служащего будет использоваться для того, чтобы обеспечить уникальность всех записей в таблице. Именно на ключевой столбец обычно ссылаются в за-
просах или при связывании таблиц. Столбцу EMP_PHONE назначен атрибут UNIQUE, и это значит, что никакие двое служащих не должны иметь одинаковые телефонные номера. Между этими двумя атрибутами нет большой разницы за исключением того, что ключ используется для упорядочения данных таблицы и для связывания таблиц.
CREATE TABLE EMPLOYEE_PAY_TBL (EMP_ID CHAR(9) NOT NULL,
POSITION VARCHAP2(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_!D, REFERENCES EMPLOYEE_TBL (EMP_ID));
Столбец EMP_ID в этом примере назначается внешним ключом таблицы EMPLOYEE PAY_TBL Это! внешний ключ ссылается на столбец EMP_ID таблицы EMPLOYEE_TBL. Наличие внешнего ключа гарантирует, что для, каждого значения ЕМР ID в таблице EMFLOYEE_PAY_TBL найдется соогве!С1вующее значение EMP_ID в таблице EMPLOYEE_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 имеет разные опции - это, в частности, относится и к опциям, задающим ограничивающие условия. Кроме того, варьируются сама форма задания ограничений, но лежащая в ее основе концепция ссылочной целостности должна быть неизменной для всех реляционных баз данных.
В предыдущих примерах ключевые слова NULL и NOT NULL использовались во всех строках с определениями столбцов после указания типа данных. Атрибут NOT NULL - это ограничение, которое можно назначить столбцу в таблице. Это ограничение не позволяет оставлять столбцы пустыми. Другими словами, для столбца, помеченного как NOT NULL, требуется наличие данных во всех строках таблицы. Если атрибут NOT NULL не назначен для столбца, для такого столбца значением по умолчанию обычно является NULL, что позволяет иметь пустые, значения в столбце.