Бобровски С. Oracle7 и вычисления клиент/сервер
Вид материала | Литература |
- Дипломная работа студента 545 группы, 334.18kb.
- «sql*net», 239.02kb.
- Вопросы к экзамену по курсу "Компьютерные системы и сети", 25.77kb.
- Приложения литература, 256.14kb.
- Программа предназначена для управления бд по технологии «клиент-сервер», 26.71kb.
- Тема: 14. Введение технологии клиент сервер. Новые возможности и средства разработки., 1083.16kb.
- Iv-я Всероссийская научная конференция «Нечеткие системы, мягкие вычисления и интеллектуальные, 92.67kb.
- Вопросы для сдачи экзамена по ктп 2008 год, 51.83kb.
- Яковлев Владимир Леонидови, кафедра "Автоматизированные информационные системы" мгту, 2163.4kb.
- Задачи восстановление пропущенных значений в реляционных бд. 20. Oltp и olap. Многомерные, 28.62kb.
2.3.3.4.3. Процедура нормализации
Как уже говорилось, нормализация – это разбиение таблицы на несколько, обладающих лучшими свойствами при обновлении, включении и удалении данных. Теперь можно дать и другое определение: нормализация – это процесс последовательной замены таблицы ее полными декомпозициями до тех пор, пока все они не будут находиться в 5НФ. На практике же достаточно привести таблицы к НФБК и с большой гарантией считать, что они находятся в 5НФ. Разумеется, этот факт нуждается в проверке, однако пока не существует эффективного алгоритма такой проверки. Поэтому остановимся лишь на процедуре приведения таблиц к НФБК.
Шаг 1. Все данные, которые должны содержаться в проектируемой базе данных, надо поместить в одну или несколько таблиц, находящихся в первой нормальной форме.
Например, пусть требуется создать базу данных для хранения рабочих учебных планов, часть одного из которых приведена на рис. 2.7 и для этого создается единственная таблица:
Раб_план (Факультет, Имя_кафедры, Специал, Имя_спец, Статус, Курс, Форма, Вариант, Уч_год, Группы, Семестр, Исполнитель, Имя_дисц, Лек, Лаб, Прак, СРС, Конт, Инд),
внешний вид которой приведен на рис. 2.8.
Эта таблица не является отношением, так как содержит множественные поля со сведениями о содержимом дисциплин (Семестр, Исполн, Имя_дисц, ...). Дополняя подстроки множественных полей недостающими данными так, как это показано на рис. 2.9, можно создать универсальное отношение, т.е. привести ее к первой нормальной форме.
Даже в усеченном виде такая таблица очень громоздка несмотря на то, что почти все ее столбцы усечены. Полный же текст, например, её третьей строки выглядит так:
«Оптико-электронные приборы и системы», «Оптико-электронных приборов и систем», «190701», «Оптико-электронные информационно-измерительные и следящие приборы и системы», «Студент», «5», «Дневная», «Основной», «1999/2000», «530», «9», «Электротехники и прецизионных электромеханических систем», «Электронно-электромеханическая база оптических приборов», «36», «36», «0», «90», «Экзамен», «СД»
и в такой таблице должно сохраняться более сорока тысяч таких строк.
Кроме того, наличие в ней огромного числа дубликатов несомненно приведет к аномалиям обновления, включения и удаления (см. п. 2.3.2).
Поэтому целесообразно уже на этом этапе разбить отношение Раб_план хотя бы на два:
Шапка_плана (Факультет, Имя_кафедры, Специал, Имя_спец, Статус, Курс, Форма, Вариант, Уч_год, Группы, Ном_план)
и
Содерж_плана (Ном_план, Семестр, Исполнитель, Имя_дисц, Лек, Лаб, Прак, СРС, Конт, Инд),
связанных между собой значениями в столбцах Ном_план.
Шаг 2. Определение возможных ключей таблиц и выбор (назначение) первичных.
В рассматриваемом примере первая таблица имеет два возможных ключа:
Факультет, Имя_кафедры, Специал, Статус, Курс, Форма, Вариант, Уч_год
и
Ном_план.
Естественно, что в качестве первичного ключа лучше использовать, специально введенное цифровое автонумеруемое поле Ном_план.
Во второй таблице единственный возможный (он же первичный) ключ:
Ном_план, Семестр, Исполнитель, Имя_дисц, Лек, Лаб, Прак, СРС, Конт, Инд.
составленный из всех её полей
Шаг 3. Выявление полей, функционально зависящих от части составного возможного ключа, и формирование новых таблиц.
В таблице Содерж_плана таких полей нет. В таблице же Шапка_плана есть поле Имя_спец, зависящее только от поля Специал, являющегося частью возможного ключа.
Полученная функциональная зависимость определяет состав выделенной из Шапка_плана новой таблицы Специал:
Специал (Специал, Имя_спец)
и вид скорректированной таблицы:
Шапка_плана (Факультет, Имя_кафедры, Специал, Статус, Курс, Форма, Вариант, Уч_год, Группы, Ном_план)
Шаг 4. Повторение шагов 2 и 3 до тех пор, пока все таблицы не будут находиться в НФБК.
В нашем примере все таблицы уже находятся в НФБК.
Шаг 5. Создание справочных таблиц.
Если в таблице базы данных существует большое текстовое поле с часто повторяющимися данными, то целесообразно создать на его основе новую таблицу, состоящую из неповторяющихся значений этого поля и связанных с ними ключей. В качестве ключа можно использовать цифровое или короткое текстовое поле, значения которого будет заменять значения большого текстового поля в исходной таблице.
В нашем примере такой таблицей стала (правда по другим причинам) таблица Специал. Кроме нее могут быть созданы таблицы:
Факультеты (Факульт, Факультет),
Имя_дисц (Кор_дисц, Имя_дисц),
Отделы (Отдел, Имя_отд),
где аббревиатура имени факультета (Факульт), сокращенное название дисциплины (Кор_дисц) и номер отдела (Отдел) могут заменить в исходных таблицах поля Факультет, Имя_дисц, Имя_кафедры и Исполнитель.
2.4. Даталогическая модель базы данных "Учебный процесс"
2.4.1. О базе данных Oracle, ее пользователях и схемах
Под словосочетанием "база данных Oracle" подразумевают физическую и логическую структуру, используемую для хранения информации. В одной базе данных Oracle можно хранить множество разных наборов информации — множество схем. Схема — это набор объектов базы данных (таблиц, представлений, моментальных копий или снимков, индексов, последовательностей, синонимов, процедур, функций, пакетов и триггеров). Понятие схемы — это небольшая поправка к СУБД Oracle, введенная с версии 7. Ранее все объекты принадлежали создавшему их пользователю («CREATору»). По умолчанию схема аналогична подключенному в настоящее время пользователю.
Администратор базы данных (АБД) Oracle создает новую пустую схему, задавая ее имя и пароль. Нередко таким именем является имя пользователя. Так АБД сервера Oracle кафедры ВТ создал такие схемы для многих студентов ФКТиУ, дав каждой из них имя, составленное из символа «s» и номера студента. Например, студентам Ветчинкину Сергею Борисовичу (Номер = 15174) и Кандиболоцкому Петру Андреевичу (Номер = 15863) предоставлены для работы в Oracle схемы с именами s15174 и s15863. Пароли для получения доступа к этим схемам отличаются от имени первым символом («p» вместо «s»). Кроме того, студентам даны права на создание объектов в своих схемах и права на чтение таблиц схемы c именем «ucheb», в которой храниться иллюстрационная база данных, используемая в лабораторном практикуме.
2.4.2. Как подключиться к Oracle
После регистрации в операционной системе Solaris (версии UNIX Sun Microsystems), под управлением которой работают рабочие станции и сервер Oracle кафедры ВТ, студент получает возможность вызова интерактивного, программного интерфейса с Oracle - SQL*Plus. Для этого вводится команда:
sqlplus.
После ввода имени пользователя (схемы) и пароля будет выведено приглашение для ввода командной строки Oracle:
SQL>_
Эта строка может содержать любую команду языков SQL, SQL*Plus или PL/SQL, о которых будет рассказано ниже.
2.4.3. Условные обозначения, используемые в синтаксисе команд
[ ] — в эти скобки заключаются необязательные синтаксические единицы
{ } — конструкция, заключенная в эти скобки, должна рассматриваться как одна синтаксическая единица
| — используется для разделения альтернативных синтаксических единиц
... — указывает на то, что непосредственно предшествующая синтаксическая единица может повторяться один или несколько раз
text — '[символ | '']...'
integer — цифра[цифра]...
number — [+|-]{цифра[цифра]...[.][цифра]... |.цифра[цифра]...}[{e|E}[+|-]цифра[цифра]...]
expr — любое выражение
Expr_list — (expr [, expr] ...)
2.4.4. О синтаксисе команд для создания и изменения описания таблиц
2.4.4.1. Создание описания таблицы (CREATE TABLE)
Для создания описания таблиц в языке SQL существует оператор CREATE TABLE, сокращенный синтаксис которого имеет вид:
CREATE TABLE [schema.]table
( { column [datatype] [DEFAULT expr] [column_constraint] ... }
[, { column [datatype] [DEFAULT expr] [column_constraint] ... } ]
[ {, table_constraint } ... ] )
[AS subquery] ;
где
schema — необязательный параметр, идентифицирующий схему, в которую надо поместить создаваемую таблицу (по умолчанию - схема пользователя);
table — имя создаваемой таблицы: до 30 символов (буквы, цифры и символы "$", "#" или "_"), начинающееся с буквы или "_"; возможно также использование в имени любых символов (кроме двойных кавычек) или составлять имя из нескольких слов, если такое имя будет заключено в кавычки (например, "Новая таблица");
column — уникальное для данной таблицы имя столбца, формируемое по тем же правилам, что и имя таблицы;
datatype — тип данных значений столбца (NUMBER, DATE, VARCHAR2, CHAR, LONG, RAW, LONG RAW), который можно не указывать, если столбец является внешним ключом или частью такого ключа (тип данных будет определен по соответствующему столбцу в первичном ключе);
DEFAULT expr — необязательный параметр, используемый для задания с помощью выражения expr значение столбца по умолчанию, если оператор INSERT "забудет" при вставке строки занести значение в данный столбец; выражение (expr) не может содержать ссылок на другие столбцы, псевдостолбцов (CURRVAL, NEXTVAL, LEVEL или ROWNUM), дат и не полностью определенных констант; с синтаксисом написания выражений (expr) можно познакомиться ниже (п. 2.4.5.2);
column_constraint — необязательный параметр, с помощью которого задается одно или несколько (указано с помощью "...") ограничений целостности на значения столбца (синтаксис column_constraint приведен ниже);
table_constraint — необязательный параметр, с помощью которого задаются, разделенные запятыми, ограничения целостности таблицы (синтаксис table_constraint приведен ниже);
AS subquery — необязательный параметр, с помощью которого можно вставить в создаваемую таблицу строки данных в соответствии с подзапросом (subquery); может также использоваться для копирования как описания (без ограничений целостности), так и содержимого таблицы;
точка с запятой (;) — завершающий элемент любого оператор языка SQL.
Пример. Создать описание таблицы Вып_каф (см. п. 2.3.3.2):
CREATE TABLE Вып_каф
(Кафедра NUMBER(3),
Факульт CHAR(5),
Специал VARCHAR(6),
Статус CHAR(9),
Курс NUMBER(1),
Вариант CHAR(3),
Начало DATE,
Конец DATE,
Форма VARCHAR(8),
Нач_дипл DATE,
Ном_план NUMBER(4),
Пользов NUMBER(4),
Измен DATE);
2.4.4.2. Создание ограничений целостности
Как уже отмечалось выше, ограничения целостности задаются в операторе CREATE TABLE с помощью параметров column_constraint и table_constraint. Они описывают правила, применимые к таблицам во время и (или) после их создания, которые оговаривают допустимые значения столбцов и (или) допустимые сочетания этих значений.
Синтаксис параметра column_constraint имеет вид:
[CONSTRAINT constraint]
{ [NOT] NULL | {UNIQUE | PRIMARY KEY}
| REFERENCES [schema.]table [(column)] [ON DELETE CASCADE]
| CHECK (condition) }
где
CONSTRAINT constraint — необязательный параметр, используемый для задания имени (на месте constraint) ограничения (имя формируется по тем же правилам, что и имена таблиц); если имя не задано, то Oracle присваивает ограничению свое имя, вывод которого на экран при ошибке (например, отсутствии уникальности вводимого значения) резко усложняет процесс идентификации места ошибки;
PRIMARY KEY — первичный ключ (не может быть назначен для столбцов с типом данных LONG, RAW, LONG RAW); в столбце, объявленном первичным ключом, значения должны быть уникальными и не пустыми (NOT NULL); по значениям такого столбца автоматически строится индекс;
UNIQUE — отличается от PRIMARY KEY тем, что в связанном с ним столбце допускаются пустые (NULL) значения; фигурные скобки, в которые заключены UNIQUE и PRIMARY KEY, оговаривают, что столбец может иметь лишь одно из этих ограничений;
[NOT] NULL — указывает, что в этот столбец надо поместить пустое (NULL) или некоторое непустое (NOT NULL) значение;
REFERENCES — неявное объявление внешнего ключа, т.е. ссылка на первичный или уникальный ключ, ранее объявленный в таблице [schema.]table для столбца column (когда имя столбца опущено, автоматически выбирается первичный ключ); если опция ON DELETE CASCADE опущена, то строки с ключевыми значениями в таблице с первичным или уникальным ключом не могут быть удалены, пока не будут удалены все ссылающиеся на них строки из данной таблицы (таблицы с внешним ключом); REFERENCES допускает ввод пустых значений (для их исключения надо одновременно вводить ограничение NOT NULL);
CHECK — используется для контроля данных по условию, текст которого размещается в скобках; с синтаксисом написания условий (condition) можно познакомиться ниже (п. 2.4.5.3); CHECK не может содержать: запросов на обращение к другим таблицам или другим строкам данной таблицы; обращений к системным переменным и константам (например, SYSDATE - текущая дата). CHECK допускает ввод пустых (NULL) значений.
В тех случаях, когда ограничение относится не к одному столбцу, а к их комбинации, используются ограничения на уровне всей таблицы. Их синтаксис имеет вид:
[CONSTRAINT constraint]
{ {UNIQUE | PRIMARY KEY} (column [,column] ...)
| FOREIGN KEY (column [,column] ...)
REFERENCES [schema.]table [(column [,column] ...)]
[ON DELETE CASCADE]
| CHECK (condition) }
где
CONSTRAINT constraint, UNIQUE и PRIMARY KEY имеют тот же смысл, что и в ограничениях для одного столбца, однако здесь для UNIQUE или PRIMARY KEY должен задаваться в скобках перечень столбцов, входящих в комбинацию;
FOREIGN KEY — внешний ключ, состоящий из одного или нескольких столбцов (column [,column] ...), ссылающийся (REFERENCES) на первичный или уникальный ключ, ранее объявленный в таблице [schema.]table для столбцов (column [,column] ...); отсутствие последнего перечня и (или) опции ON DELETE CASCADE приводят к тем же результатам, что и для описанных выше столбцовых ограничениях; для удовлетворения этого ограничения значения всех столбцов внешнего ключа должны совпадать со значениями соответствующих столбцов первичного (уникального) ключа или иметь пустое (NULL) значение хотя бы в одном из столбцов;
CHECK — используется для контроля данных по условию, текст которого размещается в скобках.
Пример. Создать описание таблицы Вып_каф с ограничениями, описанными в п. 2.3.3.2:
CREATE TABLE Вып_каф
(Кафедра NUMBER(3) NOT NULL CONSTRAINT "Такой кафедры нет !"
REFERENCES Отделы(Отдел),
Факульт CHAR(5) NOT NULL CONSTRAINT "Код факультета в Вып_каф?"
REFERENCES Факультеты (Факульт),
Специал VARCHAR(6) NOT NULL,
Статус CHAR(9) NOT NULL,
Курс NUMBER(1) NOT NULL CONSTRAINT "Курс должен быть 1-6 !"
CHECK (Курс IN (1,2,3,4,5,6)),
Вариант CHAR(3) NOT NULL CONSTRAINT "Должен быть Осн,Ин1,... !"
CHECK (Вариант IN ('Осн','Ин1','Ин2','Ин3','Ин4',
'Ин5','Ин6','Ин7','Ин8','Ин9')),
Начало DATE NOT NULL,
Конец DATE NOT NULL,
Форма VARCHAR(8) NOT NULL CONSTRAINT "Вечерняя, дневная, заочная !"
CHECK (Форма IN ('вечерняя', 'дневная', 'заочная')),
Нач_дипл DATE,
Ном_план NUMBER(4) CONSTRAINT "Номер плана введен неверно!" PRIMARY KEY,
Пользов NUMBER(4),
Измен DATE,
CONSTRAINT "Не между Начало и Конец !"
CHECK (Нач_дипл BETWEEN Начало AND Конец),
CONSTRAINT "Начало Вып_каф > конца !" CHECK (Начало <= Конец),
CONSTRAINT "Этих Специал-Статус нет!" FOREIGN KEY (Специал, Статус)
REFERENCES Специал(Специал, Статус),
CONSTRAINT "Уникальность строк Вып_каф ?"
UNIQUE (Кафедра, Специал, Статус, Вариант, Начало, Конец, Курс, Форма));
Следует отметить, что в данном примере используются имена ограничений, написанные на русском языке (по правилам создания имен они заключены в кавычки и ограничены 30 символами). Это сделано для облегчения идентификации ошибок, сообщения о которых (вместе с таким именем) выводятся на экран при некорректном вводе или изменении данных таблицы Вып_каф.
2.4.4.3. Оператор COMMENT и способы ввода пояснений в текст оператора
Для сохранения в базе данных комментария к таблице или любому ее столбцу используется оператор COMMENT, синтаксис которого имеет вид:
COMMENT ON { TABLE [schema.]{table | view | snapshot}
| COLUMN [schema.]{table | view | snapshot}.column } IS 'text'
где
view и snapshot — имена представления или моментальной копии (снимка);
text — набор любых символов (кроме апострофов), заключенный в апострофы (')
Для включения пояснений в любое предложение SQL и командные блоки PL/SQL можно либо расположить текст пояснения между парами символов /* и */, либо предварить его двумя дефисами (--).
С помощью первого способа можно включать многострочные пояснения. Для включения многострочных пояснений вторым способом приходится помещать "--" перед каждой их строкой. Следует заметить, что комментарии, отмеченные "--" могут располагаться либо в отдельных строках, либо в конце строк текста комментируемого предложения.
Пример. Создать комментарии к таблице Вып_каф и ее столбцам:
COMMENT ON TABLE Вып_каф
IS 'Специализации выпускающих кафедр и их связь с группами (Груп_спец)';
COMMENT ON COLUMN Вып_каф.Кафедра IS 'Код выпускающей кафедры';
COMMENT ON COLUMN Вып_каф.Факульт
IS 'Аббревиатура факультета, обеспечивающего обучение по данному плану';
COMMENT ON COLUMN Вып_каф.Специал IS 'Номер специальности (специализации)';
COMMENT ON COLUMN Вып_каф.Статус
IS 'Статус обучаемого (студент, бакалавр, магистр, аспирант, докторант)';
COMMENT ON COLUMN Вып_каф.Курс IS 'Номер курса';
COMMENT ON COLUMN Вып_каф.Начало IS 'Начало действия атрибутов данной строки';
COMMENT ON COLUMN Вып_каф.Конец IS 'Конец действия атрибутов данной строки';
COMMENT ON COLUMN Вып_каф.Форма
IS 'Форма обучения (дневная, вечерняя, заочная)';
COMMENT ON COLUMN Вып_каф.Нач_дипл
IS 'Дата начала дипломного проектирования (для дипломников)';
COMMENT ON COLUMN Вып_каф.Ном_план
IS 'Номер учебного рабочего плана (автонумеруемый)';
COMMENT ON COLUMN Вып_каф.Пользов
IS 'Код пользователя, создавшего (изменившего) данную строку';
COMMENT ON COLUMN Вып_каф.Измен
IS 'Дата и время создания (изменения) строки';
2.4.4.4. Изменение описания (ALTER TABLE)
Для изменения описания пустой или даже заполненной таблицы используется оператор языка SQL ALTER TABLE. Он позволяет добавлять столбцы и изменить тип данных или ограничений целостности, а также включать и выключать ограничения. Синтаксис оператора имеет вид:
ALTER TABLE [schema.]table
[ADD { { column [datatype] [DEFAULT expr] [column_constraint] ...
| table_constraint }
| ( { column [datatype] [DEFAULT expr] [column_constraint] ...
| table_constraint }
[, { column [datatype] [DEFAULT expr] [column_constraint] ...
| table_constraint } ... ) } ]
[MODIFY { column [datatype] [DEFAULT expr] [column_constraint]
| (column [datatype] [DEFAULT expr] [column_constraint]
[, column [datatype] [DEFAULT expr] [column_constraint] ] ...) } ]
[DROP { PRIMARY KEY | UNIQUE (column [,column] ...) |CONSTRAINI constraint }
[CASCADE] ] ...
[ENABLE enable_clause | DISABLE disable_clause ] ... ;
Здесь основные параметры имеют тот же смысл, что и для оператора CREATE TABLE.
Добавляемые (указанные вслед за ADD) новые столбцы помещаются лишь в конец таблицы и не содержат данных. Если добавляемый столбец имеет ограничение NOT NULL, то его можно вставить только в пустую таблицу.
С помощью синтаксических конструкций table_constraint в описание существующих столбцов можно добавлять любые новые ограничения кроме NOT NULL, которое добавляется опцией MODIFY.
При изменении описания столбца (опция MODIFY) все параметры, которые не включены в это описание, сохраняют старые значения. MODIFY используется для изменения типа данных и (или) размера значений столбца, значения по умолчанию и ограничения NOT NULL (другие ограничения можно только добавлять).
Допускаются изменения типа данных CHAR на VARCHAR2 и наоборот, но только если столбец не содержит данных или не уменьшается их размерность. Можно также увеличивать размер и (или) точность столбцов с числовыми значениями.
Изменение значения по умолчанию будет актуально только для вновь вставляемых строк (ранее существующие пустые значения столбца не будут изменены).
Следует отметить, что изменения, выполненные с помощью ALTER TABLE, могут привести к потере актуальности связанных с таблицей представлений, процедур и функций. Поэтому после ALTER TABLE следует "освежить" указанные объекты, например, пересоздав их, используя опцию OR REPLACE в соответствующих операторах CREATE ... .
Фраза DROP позволяет удалить указанные в ней ограничения и, если задана опция CASCADE, то одновременно удалить все связанные с ними внешние ключи.
С помощью DISABLE disable_clause и ENABLE enable_clause можно отключать и вновь включать одиночные ограничения целостности или все триггеры, связанные с таблицей, указанной в ALTER TABLE. Их синтаксис имеет вид:
DISABLE { { UNIQUE (column [, column] ...) | PRIMARY KEY
| CONSTRAINT constraint } [CASCADE]
| ALL TRIGGERS }
ENABLE { { UNIQUE (column [, column] ...) | PRIMARY KEY
| CONSTRAINT constraint }
| ALL TRIGGERS }
Для примера приведем описание таблицы Вып_каф с помощью пары операторов: CREATE TABLE (для ввода описания столбцов и ограничений типа NOT NULL) и ALTER TABLE (для добавления к ним описаний других ограничений целостности):
CREATE TABLE Вып_каф
(Кафедра NUMBER(3) NOT NULL,
Факульт CHAR(5) NOT NULL,
Специал VARCHAR(6) NOT NULL,
Статус CHAR(9) NOT NULL,
Курс NUMBER(1) NOT NULL,
Вариант CHAR(3) NOT NULL,
Начало DATE NOT NULL,
Конец DATE NOT NULL,
Форма VARCHAR(8) NOT NULL,
Нач_дипл DATE,
Ном_план NUMBER(4),
Пользов NUMBER(4),
Измен DATE );
ALTER TABLE Вып_каф
ADD ( CONSTRAINT "Такой кафедры нет ! " FOREIGN KEY (Кафедра)
REFERENCES Отделы(Отдел),
CONSTRAINT "Код факультета в Вып_каф? " FOREIGN KEY (Факульт)
REFERENCES Факультеты (Факульт),
CONSTRAINT "Этих Специал-Статус нет! " FOREIGN KEY (Специал,Статус)
REFERENCES Специал(Специал, Статус),
CONSTRAINT "Курс должен быть 1-6 !" CHECK (Курс IN (1,2,3,4,5,6)),
CONSTRAINT "Должен быть Осн,Ин1,Ин2,... !" CHECK (Вариант IN
('Осн','Ин1','Ин2','Ин3','Ин4','Ин5','Ин6','Ин7','Ин8','Ин9')),
CONSTRAINT "Начало Вып_каф > конца ! " CHECK (Начало <= Конец),
CONSTRAINT "Вечерняя, дневная,заочная !"
CHECK (Форма IN ('вечерняя', 'дневная', 'заочная')),
CONSTRAINT "Не между началом и концом !"
CHECK (Нач_дипл BETWEEN Начало AND Конец),
CONSTRAINT "Номер плана введен неверно !" PRIMARY KEY (Ном_план),
CONSTRAINT "Уникальность строк Вып_каф ? "
UNIQUE (Кафедра,Специал,Статус,Вариант,Начало,Конец,Курс,Форма) );
Добавление ограничений можно осуществить и несколькими операторами ALTER TABLE (например, по одному на каждое ограничение):
ALTER TABLE Вып_каф ADD CONSTRAINT "Такой кафедры нет ! "
FOREIGN KEY (Кафедра) REFERENCES Отделы(Отдел);
ALTER TABLE Вып_каф ADD CONSTRAINT "Код факультета в Вып_каф? "
FOREIGN KEY (Факульт) REFERENCES Факультеты (Факульт);
...