Меню
Главная
Авторизация/Регистрация
 
Главная arrow Информатика arrow Базы данных

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

Вначале отметим две важные особенности таблиц SQL по сравнению с отношениями реляционной модели:

  • • в таблицах SQL допустимы идентичные строки, поэтому нет требования обязательного наличия потенциальный ключей;
  • • в таблицах SQL столбцы рассматриваются в порядке слева направо, тогда как в отношении порядок атрибутов неважен.

Базовые таблицы создаются с помощью оператора CREATE TABLE, формат которого

CREATE TABLE ctable name> (table-element-commalist) где <table name> – имя создаваемой базовой таблицы; table-element- commalist – список через запятую определений столбцов или ограничений уровня таблицы. В списке элементов должно быть хотя бы одно определение столбца.

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

Ограничение NOT NULL требует, чтобы столбец не мог содержать значение NULL (все значения должны быть определены). По умолчанию или при явном указании NULL в определении столбца неопределенные значения допускаются.

Ключевое слово PRIMARY KEY позволяет указать первичный ключ, a UNIQUE – альтернативный. Оба эти ограничения требуют уникальности значений, но PRIMARY KEY дополнительно включает ограничение NOT NULL. Таким образом, если для столбца задано ограничение UNIQUE, в этом столбце может встречаться значение NULL не более одного раза.

Если указано ограничение CHECK (<условие>), будет выполняться проверка условия на значение. Попытка создания строки рассматривается как нарушение проверочного условия, если в результате вычисления условного выражения получено значение "ложь".

Ограничение внешнего ключа, если его задавать как ограничение уровня столбца, описывается в соответствии с форматом REFERENCES -Stable name> [ (column) ]

[ON DELETE option] [ON UPDATE option] где -stable name> – имя таблицы, на которую ссылается внешний ключ; в скобках может быть указан столбец, если он опущен, то объект ссылки – первичный ключ указанной таблицы; option определяет поведение при попытке удалить или изменить строку "родительской" таблицы, на которую ссылается внешний ключ; может принимать значения NO ACTION (запретить изменение), CASCADE (каскадировать изменение ли удаление), SET DEFAULT (установить значение по умолчанию), SET NULL (установить значение NULL).

Рассмотрим несколько примеров. Пусть нужно создать таблицу Т5 с двумя столбцами – целочисленным первичным ключом Id и вещественным столбцом Sura, значение которого должно быть обязательно определено. Это можно сделать с помощью следующего оператора:

CREATE TABLE Т5 (Id INTEGER PRIMARY KEY,

Sum REAL NOT NULL)

Следующий пример – создание таблицы Students со столбцами Studld, Fio, Group. При определении двух последних столбцов используем созданные в параграфе 7.2 домены Dname и Dgroup, а столбцу Group определим значение по умолчанию. Код на SQL будет выглядеть следующим образом: CREATE TABLE Students (Studld INTEGER PRIMARY KEY,

Fio Dname, Group Dgroup DEFAULT 383)

Здесь хотелось бы обратить внимание на следующее: и для домена Dname, и для домена Dgroup в параграфе 7.2 были определены значения по умолчанию. Однако у столбца Group будет значение по умолчанию, явно заданное при создании таблицы, а у Fio – унаследованное от определения домена.

В зависимости от СУБД из-за совпадения названия столбца и ключевого слова языка SQL может понадобиться явно указать, что Group – это название столбца. В случае Microsoft SQL Server для этого используются квадратные скобки – [Group].

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

Ограничения уровня таблицы описываются в операторе CREATE TABLE после описания столбцов. Используется следующий формат: [CONSTRAINT cconstraint name>]

{PRIMARY KEY I UNIQUE } (column_commalist)

|FOREIGN KEY (column_commalist) reference s_definition| CHECK (conditional_expression)}

He разбирая формат подробно, приведем несколько примеров. Пусть требуется создать таблицу Results с результатами сдачи экзаменов студентами. Столбцы: Studld – идентификатор студента, внешний ключ, ссылающийся на аналогичный столбец в таблице Students, Subj – название предмета, Mark – оценка за предмет. Первичный ключ составной: Studld и Subj. Подобную таблицу можно создать с помощью следующего выражения:

CREATE TABLE Results

(Studld INTEGER REFERENCES Students,

Subj CHAR(20),

Mark SMALLINT NOT NULL,

PRIMARY KEY (Studld, Subj),

CHECK (Mark>=2 and Mark<=5))

Здесь в определении внешнего ключа пропущено указание на столбец в таблице, иа которую ссылаемся. Это означает, что внешний ключ ссылается на первичный ключ соответствующей таблицы. Такой же результат, но с явным заданием имен первичного и внешнего ключей и ограничения CHECK, получится при выполнении выражения CREATE TABLE Results (Studld INTEGER,

Subj CHAR(20),

Mark SMALLINT NOT NULL,

CONSTRAINT pk_Results PRIMARY KEY (Studld, Subj), CONSTRAINT fk_Results FOREIGN KEY (Studld)

REFERENCES Students (Studld),

CONSTRAINT ck_Results CHECK (Mark>=2 and Mark<=5)) Здесь pk_Results, fk_Results, ck_Results – явно заданные названия ограничений. Явное указание имен ограничений может быть полезно, например, при их изменении. В то же время, если ключевое слово CONSTRAINT и название ограничения пропустить, СУБД автоматически сгенерирует имя ограничения, которое можно будет узнать с помощью инструментов администрирования.

Базовая таблица может быть изменена оператором ALTER TABLE. Допустимы следующие изменения:

  • • добавление и удаление столбцов;
  • • определение для существующего столбца значения по умолчанию и удаление ранее определенного значения по умолчанию;
  • • создание нового ограничения целостности для таблицы и удаление ранее определенного.

Пропустим подробное рассмотрение формата и сразу перейдем к примерам. Выше была создана таблица Results, добавим в нее столбец для комментария к оценке, после чего удалим его:

ALTER TABLE Results ADD Comment varchar(100);

ALTER TABLE Results DROP COLUMN Comment

Здесь нужно сделать два замечания. Стандарт SQL допускает в первом выражении наличие необязательного ключевого слова COLUMN (получится "...ADD COLUMN Comment..."), но в диалекте Transact-SQL это не допускается. В большинстве СУБД, чтобы отделить одно выражение (запрос) на SQL от другого, используется разделитель ";", но эта настройка может меняться.

Теперь предположим, что изменился диапазон оценок – стала допустима оценка "1". Удалим старое ограничение целостности ck_Results и определим новое:

ALTER TABLE Results DROP CONSTRAINT ck_Results;

ALTER TABLE Results ADD CONSTRAINT ck_ResultS CHECK (Mark>=l and Mark<=5)

Базовая таблица может быть удалена оператором DROP TABLE, формат которого представлен ниже:

DROP TABLE ctable name> (RESTRICT | CASCADE) где ctable name> – название существующей базовой таблицы; опция RESTRICT не позволит удалить таблицу, если она используется при определении какого-либо представления или ограничения целостности; при использовании опции CASCADE оператор выполняется в любом случае, определения представлений и ограничений целостности, включающие указания на данную таблицу, также будут удалены.

Надо отметить, что в СУБД SQL Server опции RESTRICT и CASCADE не поддерживаются, а оператор DROP TABLE всегда работает так, как будто указана опция RESTRICT. Таким образом, таблицу Т1 можно удалить с помощью следующего выражения:

DROP TABLE T1

 
< Предыдущая   СОДЕРЖАНИЕ   Следующая >
 

Популярные страницы