Ключевые фразы и параметры
table_ constraint
Синтаксис table_constraint является частью определения таблицы. Ограничение целостности, заданное согласно этого синтаксиса, может использовать любые столбцы таблицы. Эта синтаксическая форма может использоваться для задания ограничения целостности на один столбец или на несколько столбцов таблицы
Синтаксис table_constraint может использоваться в предложениях CREATE TABLE или ALTER TABLE. В этой форме можно задавать все ограничения целостности за исключением NOT NULL.
column_ constraint
Синтаксис column_constraint является частью определения столбца. Эта форма ограничения целостности используется для определения ограничений, которые накладываются на единственный столбец. Эту синтаксическую форму определения целостности НЕЛЬЗЯ использовать для задания ограничения на два или несколько столбцов.
Форма column_constraint может задаваться в предложениях CREATE TABLE или ALTER TABLE ADD и используется для определения ограничения любого типа.
Форма Column_constraint может задаваться в предложении ALTER TABLE MODIFY column_options и может специфицировать только ограничение NOT NULL.
CONSTRAINT
Дает возможность идентифицировать (именовать) ограничение с помощью имени constraint. Если вы не указываете ни ограничение NULL ни ограничение NOT NULL в определении столбца, то по умолчанию предполагается NULL. Эта конструкция является факультативной. При ее отсутствии Oracle самостоятельно присваивает имя ограничению целостнисти.
UNIQUE
Указывает, что столбец или совокупность столбцов должны удовлетворять ограничению UNIQUE. Ограничение UNIQUE указывает, что ни какие две строки таблицы не могут содержать одинаковых значений столбца(ов) с этим ограничением. Однако уникальный ключ, состоящий из елинственного столбца, может содержать NULL значения.
Составной уникальный ключ состоит из совокупности столбцов. Для определения составного уникального ключа необходимо воспользоваться синтаксисом table_constraint, а не синтаксисом column_constraint. Считается, что строка, содержащая NULL значения во всех столбцах составного уникального ключа, удовлетворяет этому ограничению. Однако строки, которые имеют NULL значения для одних из столбцов составного уникального ключа, и одинаковые совокупности значений для оставшихся столбцов, нарушают это ограничение.
Вы не можете использовать один и тот же столбец (совокупность столбцов) в качестве уникального ключа и первичного ключа одновременно.
PRIMARY KEY
Указывает, что столбец или совокупность столбцов являются первичным ключом. Составной первичный ключ состоит из совокупности столбцов. Для определения составного первичного ключа следует воспользоваться синтаксисом table_constraint, а не синтаксисом column_constraint.
Таблица может содержать только один первичный ключ.
Значение первичного ключа не может повторяться в пределах таблицы.
Первичные ключи не могут содержать NULL значений.
ПО СУТИ ОГРАНИЧЕНИЕ ПЕРВИЧНОГО КЛЮЧА ОЗНАЧАЕТ ПОДДЕРЖКУ ОГРАНИЧЕНИЙ ЦЕЛОСТНОСТИ UNIQUE и NOT NULL.
Вы не можете использовать один и тот же столбец (совокупность столбцов) в качестве уникального ключа и первичного ключа одновременно.
NULL
NOT NULL
Указывает, может ли столбец содержать неопределенные значения. Ограничения NULL и NOT NULL могут задаваться только в синтаксисе column_constraint.
NULL
Указывает, что столбец может содержать неопределенные значения. Если вы не указываете ни NOT NULL ни NULL, то по умолчанию столбец может содержать неопределенные значения.
NOT NULL
Указывает, что столбец не может содержать неопределенных значений. Для удовлетворения этого ограничения любая стока таблицы должна иметь значение этого столбца.
Референциальное ограничение целостности (внешние ключи)
Референциальное ограничение целостности указывает, что столбец или совокупность столбцов выступают в качестве внешнего ключа и устанавливает связь между этим внешним ключом и конкретным первичным или уникальным ключом, который называется ключом, на который делается ссылка. Таблица, содержащая внешний ключ, называется дочерней, а таблица, на которую делается ссылка, называется родительской. Внешний ключ и ключ, на который делается ссылка, могут быть в одной таблице. В этом случае родительская и дочерние таблицы выступают в одном лице.
Для спецификации референциального ограничения целостности на уровне таблицы используйте фразу foreign_key_clause в синтаксисе table_constraint. В этом синтаксисе можно определить составной внешний ключ, который состоит из совокупности столбцов.
Для спецификации референциального ограничения целостности на уровне столбца используйте фразу REFERENCES синтаксиса column_constraint. В этом случае внешний ключ состоит из единственного столбца
Один и тот же столбец (совокупность столбцов) может выступать в качестве внешнего ключа, и первичного или уникального ключа.
Таблица может содержать множество внешних ключей. Один и тот же столбец может входить в состав многих внешних ключей.
ПО СУТИ РЕФЕРЕНЦИАЛЬНОЕ ОГРАНИЧЕНИЕ ЦЕЛОСТНОТИ ОЗНАЧАЕТ, ЧТО ВНЕШНИЙ КЛЮЧ НЕ МОЖЕТ ССЫЛАТЬСЯ НА ОТСУТСТВУЮЩЕЕ ЗНАЧЕНИЕ ТОГО КЛЮЧА, НА КОТОРЫЙ ДЕЛАЕТСЯ ССЫЛКА
Ограничения:
Ключ UNIQUE или PRIMARY , на который делается ссылка, должен уже быть определен.
Родительская и дочерняя таблицы должны быть в одной базе данных.
Нельзя определять референциальное ограничение целостности в предложении CREATE TABLE, которое содержит фразу AS subquery. В этом случае сначала создайте таблицу без ограничения, а затем добавьте его позже с помощью предложения ALTER TABLE.
foreign_key_ clause
Предоставляет возможность определить на уровне таблицы столбец или совокупность столбцов в качестве внешнего ключа. Этот синтаксис используется для определения составных внешних ключей.
Для удовлетворения референциального ограничения целостности составного ключа, либо значения столбцов внешнего ключа должны соответствовать значениям столбцов родительской таблицы, на которые делается ссылка, либо значение по крайней мере одного из столбцов внешнего ключа должно быть NULL.
Составной внешний ключ должен ссылаться на составной уникальный ключ или составной первичный ключ.
REFERENCES
Указывает, что текущий столбец является внешним ключом, и идентифицирует родительскую таблицу, а также ее столбец (совокупность столбцов), который выступают в качестве ключа, на который делается ссылка. Если определяется только родительская таблица без указания ее столбцов, то по умолчанию делается ссылка на первичный ключ родительской таблицы. Столбцы, на которые делается ссылка, и столбцы внешнего ключа должны совпадать по количеству и типу данных.
ON DELETE
Определяет, как Oracle должен автоматически поддерживать референциальную целостность, если удаляется значение того ключа, на который делается ссылка. Если эта фраза отсутствует, то Oracle запрещает удалять значение ключа родительской таблицы, на которое имеется ссылка из внешнего ключа дочерней таблицы.
CASCADE означает, что Oracle автоматически удаляет те строки дочерней таблицы, в которых имеются ссылки на удаляемое значение ключа родительской таблицы.
SET NULL означает, что значения внешнего ключа устанавливаются NULL.
CHECK
Специфицирует условие, которому должна удовлетворять любая строка таблицы. Строка удовлетворяет условию, если на ней это условие принимает значение TRUE или UNKNOWN. Когда Oracle вычисляет условие ограничения CHECK относительно конкретной строки, то имена столбцов в выражении условия ссылаются на значения этих столбцов в этой строке.
При определении для столбца многих ограничений CHECK стройте их так, чтобы не было конфликтов между ними. Oracle не проверяет условия в CHECK на их взаимную противоречивость.
Условие в ограничении CHECK может ссылаться на любой столбец таблицы, но не может ссылаться на столбцы другой таблицы.
Задание
Создайте следующие таблицы с указанными ограничениями целостности:
ВНИМАНИЕ. Наша база данных имеет структуру с так называемыми рекурсивными определениями референциальных ссылок. Имеется в виду следующее: таблица TEACHER ссылается на DEPARTMENT, которая, в свою очередь, ссылается на таблицу FACULTY. В то же самое время таблицы DEPARTMENT и FACULTY ссылаются на TEACHER. В связи с эти определение этих таблиц следует произвести следующим образом:
- Сначала определяются таблицы FACULTY и DEPARTMENT, причем их столбцы DeanFK и HeadFK (которые должны ссылаться на таблицу FACULTY) определяются без их ссылок (то есть без фраз REFERENCES)
- .Затем определяется таблица FACULTY (со ссылкой на таблицу DEPARTMENT)
- Наконец, с помощью предложения ALTER TABLE производится доопределение столбцов DeanFK и HeadFK с указанием внешних ключей на таблицу TEACHER. DeanFK HeadFK
Примечание. В терминах языке ER-моделирования наша база данных имеет следующую структуру:
Имя таблицы |
Имя столбца |
Тип данных столбца |
Длина (точность) |
Масштаб |
Назначение и ограничения целостности столбца | |
FACULTY |
FacPK |
integer |
|
|
Первичный ключ таблицы FACULTY | |
Name |
varchar2 |
50 |
|
Название факультета; уникальное, не может быть NULL | ||
DeanFK |
integer |
|
|
Декан факультета. Внешний ключ, ссылающийся на TchPK в TEACHER. Если удаляется преподаватель, являющийся деканом, то ссылка на него устанавливается в NULL. | ||
Building |
char |
2 |
|
Корпус, в котором располагается деканат факультета. Принимает значения ’1’, ’2’, ’3’, ’4’, ’5’, ’6’, ’7’, ’8’, ’9’, ’10’ | ||
Fund |
number |
9 |
2 |
Фонд финансирования факультета. Принимает значения больше 100000.00 | ||
Ограничение целостности таблицы |
| |||||
DEPARTMENT |
DepPK |
integer |
|
|
Первичный ключ таблицы | |
FacFK |
integer |
|
|
Факультет кафедры. Внешний ключ, ссылающийся на FacPK в FACULTY. Нельзя удалить факультет, если на нем имеется хотя бы одна кафедра. | ||
Name |
varchar2 |
50 |
|
Название кафедры. Не может быть NULL | ||
HeadFK |
integer |
|
|
Заведующий кафедры. Внешний ключ, ссылающийся на TchPK в TEACHER. Если удаляется преподаватель, являющийся зав. кафедрой, то ссылка на него устанавливается в NULL. | ||
Building |
char |
3 |
|
Корпус, в котором располагается кафедра Принимает значения из списка ’1’, ’2’, ’3’, ’4’, ’5’, ’6’, ’7’, ’8’, ’9’, ’10’ | ||
Fund |
number |
8 |
2 |
Фонд финансирования кафедры. Принимает значения в диапазоне 20000.00- 100000.00 | ||
Ограничение целостности таблицы |
Пара столбцов (FacFK,name) уникальна (то есть на факультете не может быть кафедр с повторяющимися названиями) | |||||
TEACHER |
TchPK |
integer |
|
|
Первичный ключ таблицы | |
DepFK |
integer |
|
|
Кафедра, на которой работает преподаватель, Внешний ключ, ссылающийся на DepPK в DEPARTMENT. Если удаляется кафедра, то автоматически устанавливаются в NULL все ссылки на нее. | ||
Name |
varchar2 |
50 |
|
Фамилия преподавателя. Не может быть NULL | ||
Post |
varchar2 |
15 |
|
Должность преподавателя Принимает значения из списка: ассистент, преподаватель, доцент, профессор | ||
Tel |
char |
7 |
|
Рабочий телефон преподавателя | ||
Hiredate |
date |
|
|
Дата приема на работу. Должна быть больше 01.01.1950; не может быть NULL | ||
Salary |
number |
6 |
2 |
Ставка. Должна быть больше 1000, не может быть NULL | ||
Commission |
number |
6 |
2 |
Надбавка к ставке. Значение по умолчанию равно 0. Не может быть отрицательной. | ||
ChiefFK |
Integer |
|
|
Непосредственный руководитель преподавателя. Внешний ключ, ссылающийся на первичный ключ TchPK таблицы TEACHER. Если удаляется преподаватель, то все ссылки на него как на руководителя устанавливаются в NULL. | ||
Ограничение целостности таблицы |
a) Commission должно быть по крайне мере в два раза меньше, чем Salary b) Salary + Commission должен находиться в диапазоне 1000 - 3000 с) ChiefFK не должен быть равен TchPK (то есть преподаватель не может быть руководителем самого себя) | |||||
SGROUP |
GrpPK |
integer |
|
|
Первичный ключ таблицы | |
DepFK |
integer |
|
|
Кафедра группы. Внешний ключ, ссылающийся на DepPK в DEPARTMENT. При удалении кафедры все ссылки не нее становятся NULL. | ||
Course |
number |
1 |
|
Курс группы. Принимает значения из списка: 1, 2, 3, 4, 5, 6 | ||
Num |
number |
3 |
|
Номер группы. Принимает значения больше 0 и меньше 700 | ||
Quantity |
number |
2 |
|
Количество студентов в группе. Принимает значения в интервале 1 – 50 | ||
Curator |
integer |
|
|
Куратор группы Внешний ключ, ссылающийся на TchPK в TEACHER. При удалении преподавателя все ссылки на него как на куратора становятся NULL. | ||
Rating |
number |
3 |
|
Рейтинг группы. Значение по умолчанию равно 0 Принимает значения в диапазоне 0–100. | ||
Ограничение целостности таблицы |
Пара значений столбцов (DepFK, Num) является UNIQUE (то есть на одной кафедре не могут быть группы с одинаковыми номерами) Пара значений столбцов внешних ключей (DepFK, Curator) является уникальной. То есть один и тот же преподаватель не может быть куратором более, чем одной группы на одной кафедре) | |||||
SUBJECT |
SbjPK |
integer |
|
|
Первичный ключ таблицы | |
Name |
varchar2 |
50 |
|
Название дисциплины. Должно быть уникальным и не равным NULL | ||
Ограничение целостности таблицы |
| |||||
ROOM |
RomPK |
integer |
|
|
Первичный ключ таблицы | |
Num |
number |
4 |
|
Номер аудитории. Не может принимать значение NULL | ||
Seats |
number |
3 |
|
Количество место в аудитории Принимает значения в интервале 1 - 300 | ||
Floor |
number |
2 |
|
Этаж аудитории Принимает значения в интервале 1 - 16 | ||
Building |
char |
5 |
|
Корпус аудитории. Не может принимать значение NULL. Принимает значения из списка ’1’, ’2’, ’3’, ’4’, ’5’, ’6’, ’7’, ’8’, ’9’, ’10’ | ||
Ограничение целостности таблицы |
Пара значений столбцов (Num, Building) является уникальной (то есть в одном корпусе на могут быть аудитории с одинаковыми номерами) | |||||
LECTURE |
TchFK |
integer |
|
|
Преподаватель. Внешний ключ, ссылающийся на TchPK в TEACHER. При удалении преподавателя все ссылки на него устанавливаются в NULL. | |
GrpFK |
integer |
|
|
Группа. Внешний ключ, ссылающийся на GrpPK в SGROUP. При удалении группы удаляются все лекции, читаемые этой группе. | ||
SbjFK |
integer |
|
|
Дисциплина Внешний ключ, ссылающийся на SbjPK в SUBJECT. Дисциплина не может быть удалена до тех пор, пока не удалены все лекции, читаемые по этой дисциплине. | ||
RomFK |
integer |
|
|
Аудитория. Внешний ключ, ссылающийся на RomPK в ROOM. При удалении аудитории все ссылки на нее устанавливаются в NULL. | ||
Type |
varchar2 |
15 |
|
Тип занятия. Принимает значения из списка: лекция, лабораторная, семинар, практика. Не может быть NULL | ||
Day |
char |
3 |
|
День недели. Принимает значения из списка: пон, втр, срд, чет, пят, суб, вск. Не может быть NULL | ||
Week |
number |
1 |
|
Неделя. Принимает значения 1 или 2. Не может быть NULL | ||
Lesson |
number |
1 |
|
Занятие (пара) Принимает значения в интервале 1 – 8. Не может быть NULL | ||
Ограничение целостности таблицы |
Столбцы (GrpFK, Day, Week, Lesson) в совокупности являются UNIQUE (то есть у одной группы не может быть два различных занятия на одной и той же паре одного и того же дня недели и одной и той же недели) Столбцы ((TchFK, Day, Week, Lesson) в совокупности являются UNIQUE (то есть, то же самое имеет место и для преподавателя) |