Создание таблиц и индексов

Перед тем как перейти к созданию таблиц, необходимо выполнить проектирование базы данных и нормализацию таблиц.

Далее следует определить, какие таблицы и с какими столбцами (полями) подлежат созданию. Создать комплект необходимых доменов и только после этого можно перейти к физическому вводу описаний таблиц.

При создании таблицы мы должны задать, как минимум, ее имя и перечень полей с их атрибутами и контрольными ограничениями. Кроме того, при создании таблицы можно задать ее первичный ключ, внешние ключи, задающие требования по поддержанию логической целостности, дополнительные виды контроля на уровне записей [4].

Рисунок 5 - Окно Interactive SQL при создании таблицы группа и уникального индекса для данной таблицы.

 

 

Рисунок 6 - Таблица Студент

 

Выполнив данный код нажав комбинацию клавиш Ctrl+Enter мы получим таблицу, в которую затем мы можем внести записи. Однако стоит заметить т.к. между таблицей Student и Gruppa существует связь по полю Gruppa, то перед заполнением таблицы Student, необходимо заполнить соответствующие значения в таблицу Gruppa, иначе на экране появится сообщение об ошибке.

 

SQL коды для создания таблиц и индексов:

CREATE TABLE gruppa (

  gruppa          t_gruppa NOT NULL,

  god_postuplenia varchar(20),

  edvaizer        VARCHAR(20)

);

CREATE UNIQUE INDEX XPKgruppa ON gruppa

(

  gruppa

);

ALTER TABLE gruppa

  ADD PRIMARY KEY (gruppa);

CREATE TABLE student (

  kod_student     INTEGER NOT NULL,

  gruppa          t_gruppa NOT NULL,

  fio             t_fio

);

CREATE UNIQUE INDEX XPKstudent ON student

(

  kod_student

);

ALTER TABLE student

  ADD PRIMARY KEY (kod_student);

CREATE TABLE Disciplina (

  kod_disciplina  INTEGER NOT NULL,

  disciplina_p    t_disciplina_p,

  disciplina_s    t_disciplina_s,

  semestr         INTEGER

);

CREATE UNIQUE INDEX XPKDisciplina ON Disciplina

(

  kod_disciplina

);

ALTER TABLE Disciplina

 ADD PRIMARY KEY (kod_disciplina);

CREATE TABLE specialnost (

  shifr_specialnost VARCHAR(20) NOT NULL,

  specialnost_p   t_specialnost_p,

  specialnost_s   t_specialnost_s,

  god_vvedenia    varchar(20)

);

CREATE UNIQUE INDEX XPKspecialnost ON specialnost

(

  shifr_specialnost

);

ALTER TABLE specialnost

  ADD PRIMARY KEY (shifr_specialnost);

CREATE TABLE prepodavatel (

  kod_prepod      INTEGER NOT NULL,

  fio             t_fio NOT NULL,

  doljnost        t_doljnost NOT NULL

);

CREATE UNIQUE INDEX XPKprepodavatel ON prepodavatel

(

  kod_prepod

);

ALTER TABLE prepodavatel

  ADD PRIMARY KEY (kod_prepod);

CREATE TABLE vedomost (

  shifr_specialnost VARCHAR(20) NOT NULL,

  kod_prepod      INTEGER,

  kod_disciplina  INTEGER NOT NULL,

  kod_student     INTEGER,

  lc1             t_lc1,

  lc2             t_lc2,

  pr1             t_pr1,

  pr2             t_pr2,

  srs1            t_srs1,

  srs2            t_srs2,

  examen          t_examen,

  itog            t_itog

);

CREATE UNIQUE INDEX XPKvedomost ON vedomost

(

  shifr_specialnost,

  kod_disciplina

);

ALTER TABLE vedomost

  ADD PRIMARY KEY (shifr_specialnost, kod_disciplina);

CREATE TABLE uchebnii_plan (

  kod_disciplina  INTEGER NOT NULL,

  shifr_specialnost VARCHAR(20) NOT NULL,

  semestr         t_semestr,

  kol_vo_kreditov t_kol_vo_kreditov

);

CREATE UNIQUE INDEX XPKuchebnii_plan ON uchebnii_plan

(

  kod_disciplina,

  shifr_specialnost

);

ALTER TABLE uchebnii_plan

  ADD PRIMARY KEY (kod_disciplina, shifr_specialnost);

ALTER TABLE student

  ADD FOREIGN KEY (gruppa)

                       REFERENCES gruppa;

ALTER TABLE vedomost

  ADD FOREIGN KEY (kod_prepod)

                        REFERENCES prepodavatel;

ALTER TABLE vedomost

  ADD FOREIGN KEY (kod_student)

                        REFERENCES student;

ALTER TABLE vedomost

  ADD FOREIGN KEY (shifr_specialnost)

                        REFERENCES specialnost;

ALTER TABLE vedomost

  ADD FOREIGN KEY (kod_disciplina)

                        REFERENCES Disciplina;

ALTER TABLE uchebnii_plan

  ADD FOREIGN KEY (shifr_specialnost)

                        REFERENCES specialnost;

ALTER TABLE uchebnii_plan

  ADD FOREIGN KEY (kod_disciplina)

                        REFERENCES Disciplina;

Третий этап. Создав все объекты мы сможем увидеть их на дереве нашей базы (рис.7).

Затем необходимо автоматизировать уникальные значения таблиц, т.к. при работе с глобальной базой данных указать уникальное значение не всегда возможно. Так как вставкой записей могут заниматься одновременно несколько пользователей. Угадать последнее вставленное значение уникального значения практически невозможно, так что необходимо как-то автоматизировать этот процесс. С этой целью в базе данных предусмотрены специальные объекты – генераторы.

Генератор - это именованная числовая переменная, значение которой можно увеличивать с помощью специальной функции gen_id. Для того, чтобы можно было пользоваться генератором, его необходимо создать и инициализировать. Для создания генератора используется оператор (запрос).

Рисунок 7 - Окно IBConsole после создания таблиц

 

Рассмотрим установку генератора для таблицы Student(Студент), где уникальным является kod_student (номер студента). Создадим генератор, возвращающий уникальное значение для поля kod_student в таблице STUDENT и установим стартовое значение равное 1. Для этого введите в окно запросов ISQL следующее:

CREATE GENERATOR kod_student_gen

 

Рисунок 8 - Окно IBConsole после создания генераторов.

Теперь присвоим нашему генератору начальное значение. Так как в таблице STUDENT уже есть записи, то нужно инициализировать генератор наибольшим имеющимся в базе значением поля kod_student. Посмотреть его можно, набрав в окне ISQL запрос

select MAX(kod_student) from STUDENT

В окне результатов появится примерно следующее:

MAX

===

4

Значение поля равно 4 так как мы вручную внесли уже четыре записи. По умолчанию у созданного генератора значение равно 0. Наберите и выполните запрос:

SET GENERATOR kod_student_gen TO 4

Теперь текущее значение генератора равно 4. Функция gen_id() увеличивает значение генератора на заданное число и возвращает полученное значение.

С помощью генератора kod_student_gen автоматизировано получение уникального числового значения для ключевого поля kod_student, однако при каждой вставке новой записи приходится вызывать функцию gen_id(kod_student_gen,1). Сервер позволяет автоматизировать и эту задачу c помощью механизма, который называется триггером.

Триггер - это некоторая процедура, обрабатываемая автоматически SQL-сервером при возникновении определенного события в базе данных - вставки, удаления и изменения записи. Непосредственно из программы к триггерам обратиться нельзя. Нельзя и передавать им входные параметры и получать от них значения выходных параметров. Триггеры всегда реализуют действие. Триггер связан с определенной таблицей базы и никогда не вызывается пользователем напрямую. Вместо этого он срабатывает (еще говорят - «стреляет») при попытке выполнить действие, заданное в его определении.

По событию изменения таблицы БД триггеры различаются на вызываемые при:

¨ добавлении новой записи

¨ изменении существующей записи

¨ удалении записи

По отношению к событию, влекущему их вызов, триггеры различаются на:

· Выполняемые до наступления события

· Выполняемые после наступления события

· Автоматическое обеспечение каскадных воздействий в дочерних таблицах при изменении, удалении записи в родительской таблице выполняется на сервере. Пользователю нет необходимости заботиться о программной реализации каскадных воздействий, поскольку каскадные воздействия выполняет сервер, что снижает загрузку сетевого трафика.

· Изменения в триггерах не влекут необходимости изменения программного кода в клиентских приложениях и не требует распространения новых версий клиентских приложений у пользователей [8].

При операциях вставки, удаления и изменения записи в теле триггера можно обращаться к значениям полей текущей записи при помощи специальных переменных NEW и OLD, например, узнать значение поля first_name при вставке записи можно, воспользовавшись выражением NEW.kod_student. Создадим для таблицы STUDENT триггер, который будет подставлять в поле kod_student очередное уникальное значение. Введите в окне ISQL и выполните следующий запрос:

SET TERM!!;

CREATE TRIGGER kod_student_gen FOR STUDENT

BEFORE INSERT AS

BEGIN

new.kod_student=gen_id(kod_student_gen,1);

END!!

SET TERM;!!

Этот триггер будет срабатывать перед вставкой записи в таблицу STUDENT, присваивая полю kod_student уникальное значение, полученное от генератора
kod_student_gen:

new.kod_student=gen_id(kod_student_gen,1);

Затем получим еще два генератора и два триггера для таблиц PREPODAVATEL и DISCIPLINA, чтобы автоматизировать вставку новых записей. Ниже представлены SQL коды для реализации этих задач:

Для таблицы PREPODAVATEL

CREATE GENERATOR kod_PREPOD_gen

select MAX(kod_PREPOD) from prepodavatel

SET GENERATOR kod_prepod_gen TO 1

SET TERM!!;

CREATE TRIGGER kod_prepod_gen FOR PREPODAVATEL

BEFORE INSERT AS

BEGIN

new.kod_prepod=gen_id(kod_prepod_gen,1);

END!!

SET TERM;!!

Для таблицы DISCIPLINA

CREATE GENERATOR kod_disciplina_gen

select MAX(kod_disciplina) from disciplina

SET GENERATOR kod_disciplina_gen TO 1

SET TERM!!;

CREATE TRIGGER kod_disciplina_gen FOR DISCIPLINA

BEFORE INSERT AS

BEGIN

new.kod_disciplina=gen_id(kod_disciplina_gen,1);

END!!

SET TERM;!!





Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: