Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ к ЛР.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3.42 Mб
Скачать

Определение ключей

PRIMARY KEY (первичный ключ). Ограничение определяет столбец или группу столбцов, которую можно использовать для уникальной идентификации строки. Никакие две строки в таблице не могут иметь одинаковые значения столбцов первичного ключа. Кроме того, столбцы первичного ключа должны всегда содержать значение. Все эти условия гарантируют то, что в нашем распоряжение будет одна и только одна строка, соответствующая критериям связывания. Первичные ключи могут быть или именованные (пользователем) или неименованные (Oracle составляет имя сам). В первичных ключах не могут использоваться столбцы типа: raw, long, long raw.

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

Внешний ключ - это ссылка полей одной таблицы на однотипные поля другой таблицы, обладающие свойством либо (а) уникальности, либо (б) первичного ключа. Исключительно для простоты дальше речь будет идти о простых ключах, то есть состоящих из одного поля. СУБД (в нашем случае - Oracle) обязана следить за тем, чтобы значение внешнего ключа позволило найти запись в таблице, на которую он ссылается (в родительской таблице), а уникальность "родительского поля" гарантирует, что это будет ровно одна запись. Вместе с тем наличия значения в поле внешнего ключа (в подчиненной таблице) не требуется, и автоматические проверки соответствия выполняются только для существующих значений в поле внешнего ключа.

Внешний ключ в Oracle вслед за стандартным SQL реализован как разновидность ограничения. Информация о нем включается в Oracle в системную таблицу USER_CONSTRAINTS.

Внешний ключ в демонстрационной схеме SCOTT в Oracle существует: это поле EMP.DEPTNO, ссылающееся на поле первичного ключа DEPT.DEPTNO. Совпадения имен полей не требуется, но когда оно возможно, это удобно, так как подчеркивает содержательную связь.

Завести внешний ключ можно сразу при создании таблицы, или же потом, командой

ALTER TABLE xxx ADD [CONSTRAINT имя] FOREIGN KEY (fff) REFERENCING ttt(kkk);

Создание ключей можно производить непосредственно при создании таблицы:

CREATE TABLE "ИНСПЕКТОР"

( "ФИО" VARCHAR2(60) NOT NULL ENABLE,

"КОД_ИНСПЕКТОРА" NUMBER NOT NULL ENABLE,

"НОМЕР_НАЛОГОВОЙ" NUMBER NOT NULL ENABLE,

"ДАТА_РОЖДЕНИЯ" DATE NOT NULL ENABLE,

"ТЕЛЕФОН" NUMBER NOT NULL ENABLE,

CONSTRAINT "ИНСПЕКТОР_PK" PRIMARY KEY ("КОД_ИНСПЕКТОРА"))

Внешний ключ может ссылаться на поля таблицы из другой схемы

Чаще всего родительская и подчиненные таблицы находятся в одной схеме БД Oracle. Не так известно, что родительская и подчиненная таблицы могут находиться в разных схемах. Так как схемы используются для разграничения доступа, возникает вопрос о полномочиях.

Для того, чтобы иметь возможность сослаться внешним ключом на поле таблицы в другой схеме, на это поле должна иметься привилегия REFERENCING. Особо нужно отметить, что с привилегиями SELECT, INSERT, UPDATE и DELETE привилегия REFERENCING никак не связана. Иными словами схема с подчиненной таблицей может ничего не знать о конкретных значениях ключа, на которые есть возможность ссылаться, равно как на наличие других полей в таблице.

Важно отметить, что ограничения PRIMARY KEY и UNIQUE автоматически создают индексы на столбцах, для которых они определены, если ограничение активизируется при создании. Если индекс уже существует на столбцах, которые составляют ограничение PRIMARY KEY и UNIQUE, то использует именно этот индекс и Oracle не может создать новый.