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

 

22.1. Общий вид оператора CREATE TABLE *

22.2. Столбцы вычисляемых значений *

22.3. Ограничения целостности *

22.4. Первичный ключ *

22.5. Уникальный ключ *

22.6. Внешний ключ и определение ссылочной целостности *

22.7. Именование ссылочной целостности *

22.8. Требования к значениям столбцов *

22.9. Изменение объявления таблиц *

22.10. Изменение атрибутов столбца *

22.11. Удаление таблицы *

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

22.1. Общий вид оператора CREATE TABLE

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

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

Создание таблицы БД осуществляется оператором

CREATE TABLE ИмяТаблицы [EXTERNAL [FILE] "<имя файла>"] (<опр_столбца> [, <опр_столбца> | <ограничение> ...]);

[EXTERNAL [FILE] "< имя файла >"] относится к внешним, т.е. расположенным отдельно от БД, таблицам БД.

<опр_столбца> -определение столбца БД. Основные сведения об определении столбцов см. выше в разделе " Типы столбцов таблиц БД". Определение столбца имеет формат:

<опр_столбца> = опр_столбца{тип_данных | COMPUTED [BY] (<выражение>) | домен}

[DEFAULT {литерал! NULL | USER}] [NOT NULL] [<огранич_столбца>] [COLLATE collation]

где опр_столбца - имя столбца; тип_данных - тип столбца, и, возможно, размерность массива, если столбец - массив; для символьных столбцов может быть указан набор символов, отличный от принятого по умолчанию, при помощи предложения CHARACTER SET; COMPUTED [BY] (<выражете>) - служит для определения столбца вычисляемых значений (подробнее см. ниже);

domain - имя домена, т.е. ранее описанного типа столбца;

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

значения по умолчанию (см. в п.21.1);

огранич_столбца - ограничения, накладываемые на значения столбца (подробно рассматриваются ниже);

COLLAТЕ collation определяет порядок сортировки символов (для символьных столбцов) для набора символов, принятого по умолчанию или явно определенного предложением CHARACTER SET.

22.2. Столбцы вычисляемых значений

Такие столбцы описываются как COMPUTED [BY] (<выражение>)

Значение таких столбцов не вводится пользователем, а вычисляется автоматически согласно выражению. Тип результирующего значения и будет служить типом вычисляемого столбца. Например, таблица SAL_HIST, показанная на рис. 22.1, содержит номер квартала (QUORTER), количество продаж в данном квартале, в прошлом (LAST_YEAR) и текущем году (THIS_YEAR) и прирост продаж за квартал (GROWTH). Она создана таким образом:

CREATE TABLE SAL_HIST (

QUORTER INTEGER NOT NULL,

LAST_YEAR INTEGER,

THIS_YEAR INTEGER,

GROWTH COMPUTED BY (THIS_YEAR - LAST_YEAR),

PRIMARY KEY (QUORTER)

22.3. Ограничения целостности

Ограничения целостности бывают двух уровней:

• ограничения, накладываемые на отдельный столбец;

ограничения, накладываемые на таблицу.

В случае наложения ограничений целостности на отдельный столбец, описание ограничения приводится следом за именем столбца и его типом:

TOVAR TOVAR VARCHAR(20) NOT NULL PRIMARY KEY, ...

В данном случае столбец TOVAR составляет первичный ключ, что объявлено в предложении PRIMARY KEY.

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

CREATE TABLE . . . (TOVAR TOVAR VARCHAR(20) NOT NULL,PRIMARY KEY(TOVAR)) ;

22.4. Первичный ключ

Если по столбцу строится первичный ключ, столбцу может быть приписан атрибут PRIMARY KEY:

CREATE TABLE SAL_HIST (QUORTER INTEGER NOT NULL PRIMARY KEY,) ;

Заметим, что первичный ключ может быть построен и путем включения имени (имен) ключевого столбца (столбцов) в качестве параметров отдельного предложения PRIMARY KEY:

CREATE TABLE SAL_HIST (QUORTER INTEGER NOT NULL,PRIMARY KEY (QUORTER)) ;

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

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

22.5. Уникальный ключ

Атрибут UNIQUE, если он приписан столбцу, означает, что в столбце не могут содержаться два одинаковых значения. Уникальный ключ строится по столбцу (столбцам), когда столбец не входит в состав первичного ключа, но тем не менее его значение должно всегда быть уникальным. Например, для таблицы VLADLIM ("владельцы бюджетных лимитов") первичный ключ строится по коду владельца KODVLAD, введенному для сокращения объема первичного ключа и времени поиска по нему (объем ключа по столбцу типа INTEGER много меньше объема ключа по символьному полю максимальной

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

CREATE TABLE VLADLIM (

KODVLAD INTEGER NOT NULL PRIMARY KEY,

NAZVVLAD VARCHAR(50) NOT NULL UNIQUE );

Уникальность может быть приписана и на уровне таблицы:

CREATE TABLE VLADLIM (KODVLAD INTEGER NOT NULL PRIMARY KEY,

NAZVVLAD VARCHAR(SO) NOT NULL, UNIQUE (NAZVVLAD));

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

22.6. Внешний ключ и определение ссылочной целостности

Внешний ключ строится в дочерней таблице для соединения родительской и дочерних таблиц БД. Формат определения:

FOREIGN KEY (<список столбцов внешнего ключа>)

REFERENCES <имя родительской таблицы> [<список столбцов родительской таблицы>]

Список столбцов внешнего ключа определяет столбцы дочерней таблицы, по которым строится внешний ключ.

Имя родительской таблицы определяет таблицу, в которой описан первичный ключ (или столбец с атрибутом UNIQUE). На этот ключ (столбец) должен ссылаться данный внешний ключ дочерней таблицы для обеспечения ссылочной целостности. Список столбцов родительской таблицы необязателен при ссылке на первичный ключ родительской таблицы. При ссылке в родительской таблице на столбец с атрибутом UNIQUE этот список лучше привести.

Пример. Определим две таблицы:

• родительскую "Справочник товаров" SPR_TOVAR с полями TOVAR (наименование товара), ZENA_ED (цена за единицу измерения);

первичный ключ по полю TOVAR;

• дочернюю " Приход товара на склад" PRIHOD с полями ID_PRIHOD (номер прихода), DATAPRIH (дата прихода), TOVAR (товар), KOLVO

(количество прихода, ед.). Первичный ключ по полю ID_PRIHOD внешний ключ по полю TOVAR для обеспечения ссылочной целостности с таблицей SPR_TOVAR.

Тогда для определения данных таблиц в БД необходимо выполнить операторы

CREATE TABLE SPR_TOVAR(TOVAR VARCHAR(20) NOT NULL COLLATE PXW_CYRL,

ZENA_ED INTEGER NOT NULL, PRIMARY KEY(TOVAR)) ;

CREATE TABLE PRIHOD(ID_PRIHOD INTEGER NOT NULL PRIMARY KEY,

DATAPRIH DATE NOT NULL,TOVAR VARCHAR(20) NOT NULL COLLATE PXW_CYRL,

KOLVO INTEGER NOT NULL, FOREIGN KEY(TOVAR) REFERENCES SPR_TOVAR);

Теперь для таблицы SPR_TOVAR будет установлена блокировка удаления или изменения значения в столбце TOVAR записи, если в таблице PRIHOD имеются записи о приходе этого товара.

Заметим, что определение общих полей родительской и дочерней таблиц (полей связи) должно в точности совпадать. Если в родительской таблице объявить TOVAR VARCHAR(20) NOT NULL COLLATE PXW_CYRL,

а в дочерней объявить TOVAR VARCHAR(20) NOT NULL,

то из-за различий в порядке сортировки символов эти столбцы не будут фактически идентичными, из-за чего будут постоянно возникать ошибки нарушения ссылочной целостности.

ЗАМЕЧАНИЕ. Если ссылочная целостность между таблицей Р (родительской) и С (дочерней) обеспечивается при помощи связки PRIMARY KEY - FOREIGN KEY, то InterBase запрещает:

• изменять значение столбца связи в таблице Р;

• удалять запись в таблице Р,если для нее есть записи в таблице С с таким же значением поля связи.

Иными словами, связь таблиц по внешнему ключу блокирует каскадные изменения и удаления в таблицах Р и С. В том случае, если необходимо осуществлять каскадные воздействия на таблицу С при изменении (удалении) родительской записи в Р, целостность между таблицами поддерживают при помощи триггеров, а ограничение внешнего ключа удаляют. Сам внешний ключ в дочерней таблице может и не удаляться в том случае, если он используется в запросах (оператор SELECT) оптимизатором запросов InterBase. В этом случае он определяется как индекс (оператором CREATE INDEX). Об организации ссылочной целостности при помощи триггеров, а также оптимизации запросов к БД, см. ниже соответствующие разделы.

22.7. Именование ссылочной целостности

Ссылочная целостность может именоваться:

[CONSTRAINT <имя ссылочной целостности>]

FOREIGN KEY (<список столбцов внешнего ключа>)

REFERENCES <имя родительской таблицы> [<список столбцов родительской таблицы>]

Необязательное имя ссылочной целостности присутствует в системных сообщениях относительно нарушения целостности, а также может использоваться при анализе структуры БД и изменении структуры таблиц. В случае, если имя ссылочной целостности опущено, InterBase сам установит ее имя.

Например, назначим в приведенной выше таблице PRIHOD имя ссылочной целостности:

CREATE TABLE PRIHOD(

ID_PRIHOD INTEGER NOT NULL PRIMARY KEY, DATAPRIH DATE NOT NULL,

TOVAR VARCHAR(20) NOT NULL COLLATE PXW_CYRL, KOLVO INTEGER NOT NULL,

CONSTRAINT PO_TOVARU FOREIGN KEY(TOVAR) REFERENCES SPR_TOVAR);

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

CREATE TABLE VLADLIM ( KODVLAD INTEGER NOT NULL PRIMARY KEY,

NAZVVLAD VARCHAR(50) NOT NULL, CONSTRAINT PO_NAZV UNIQUE (NAZVVLAD));

22.8. Требования к значениям столбцов

Требования к значениям отдельных столбцов могут определяться как на уровне конкретного столбца, так и на уровне таблицы. Например, для таблицы PERSON_PARAMS (параметры человека) рост (HEIGHT) должен быть больше веса (WIEGHT). Тогда данное ограничение на уровне столбца определяется следующим образом:

CREATE TABLE PERSON_PARAMS( ID INTEGER NOT NULL PRIMARY KEY,

HEIGHT INTEGER NOT NULL, WIEGHT INTEGER NOT NULL CHECK(HEIGHT >WIEGHT) ) ;

а на уровне таблицы определяется - так:

CREATE TABLE PERSON_PARAMS(ID INTEGER NOT NULL, HEIGHT INTEGER NOT NULL,

WIEGHT INTEGER NOT NULL, PRIMARY KEY(ID), CHECK(HEIGHT > WEIGHT) );

Ограничения, накладываемые на столбцы таблицы, определяются при помощи предложения CHECK, общий формат которого приводится ниже.

CHECK (<условия поиска>) <условия_поиска> = {<значение> <оператор> {<значение1> | (<выбор_одного>)}

<значение> [NOT] BETWEEN <значение1> AND <значение2>

<значение> [NOT] LIKE <значение> [ESCAPE <значение>]

<значение> [NOT] IN ( <значение1> [, <значение2> ...] |

<выбор_многих>)

<значение> IS [NOT] NULL

<значение> { [NOT] {=|<|>} I >= I <=}

{ALL ] SOME | ANY} (<выбор_многих>)

EXISTS (<выражение_выбора>)

| SINGULAR (<выражение_выбора>) | <значение> [NOT] CONTAINING <значение1>

<значение> [NOT] STARTING [WITH] <значение1>

(<условия_поиска>) NOT <условия поиска>

<условия поиска> OR <условия поиска>

<условия поиска> AND <условия_поиска>}

<значение> = {столбец | <константа> I <выражение> I <функция> | NULL I USER | RDB$DB_KEY

} [COLLATE collation]

<константа> = число | "строка"

<функция> = {

COUNT (* | [ALL] <значение> | DISTINCT <значение>)

| SUM ([ALL] <значение> | DISTINCT <значение>)

AVG ([ALL] <значение> | DISTINCT <значение>)

MAX ([ALL] <значение> | DISTINCT <значение>)

MIN ([ALL] <значение> | DISTINCT <значение>)

CAST ( <значение> AS <тип_данных>)

UPPER ( <значение>)

GEN ID (генератор, <значение>)

}

<оператор> = {= | < | > | <= | >= | !< | !> | о | !=}. Назначение операторов:

= равно;

< меньше;

> больше;

<= меньше или равно (не больше);

>= больше или равно (не меньше);

!< не меньше (больше или равно);

!> не больше (меньше или равно);

<> неравно;

!= неравно;

<выбор_одного> = оператор SELECT, возвращающий одно значение или ни одного.

<выбор_многих> = оператор SELECT, который может возвращать более одного значения (список значений) или ни одного.

<выражение_выбора> = оператор SELECT , который может возвращать более одного значения (список значений) или ни одного.

<значение> <оператор> <значение1> определяет, что значение столбца находится со значением 1 во взаимоотношениях, определяемых оператором, который может принимать одно из следующих значений:

<оператор> = {= | < | > | <= | >= | !< | !> | <> | !=} Например, значение столбца STOLBEZ не должно быть меньше 100: CREATE TABLE TBL (CHECK(STOLBEZ >= 100););

<значение> <оператор> (<выбор_одного>) определяет, что значение столбца находится во взаимоотношениях, определяемых оператором оператор, с результатом выполнения запроса SELECT к одной или нескольким таблицам БД, причем в качестве результата выполнения запроса возвращается единичное значение {выбор_одного).

Пример. Пусть существует таблица TOVAR (остаток товара на складе).

CREATE TABLE TOVAR (TOVAR VARCHAR(20) CHARACTER SET WIN1251 NOT NULL

COLLATE PXW_CYRL,OSTATOK INTEGER NOT NULL,PRIMARY KEY (TOVAR));

Требуется создать таблицу RASHOD (расход товара со склада) и для столбца KOLVO_R (количество расхода) предусмотреть ограничение: количество расхода данного товара не может быть больше его текущего остатка (значение столбца OSTATOK для данного значения товара) в таблице TOVAR)

CREATE TABLE RASHOD (

ID_RS INTEGER NOT NULL,

TOVAR VARCHAR(20) CHARACTER SET WIN1251 NOT NULL

COLLATE PXW_CYRL,

DATE_RASH DATE NOT NULL,

KOLVO_R INTEGER NOT NULL,

PRIMARY KEY (ID_RS),

CONSTRAINT RASH_TOVAR

FOREIGN KEY (TOVAR) REFERENCES TOVAR(TOVAR),

CONSTRAINT PO_OSTATKU

CHECK(KOLVO_R <=

(SELECT TOVAR.OSTATOK FROM TOVAR WHERE TOVAR.TOVAR = RASHOD.TOVAR))

);

• <энвчение> BETWEEN <значение1> AND <эначение2> определяет, что значение столбца должно находиться в диапазоне от значение] до эначение2.

CREATE TABLE TBL (CHECK(STOLBEZ BETWEEN 100 AND 200);) ;

LIKE <значение> [ESCAPE <значение>] определяет, что содержимое столбца должно "походить" на значение. При этом употребляется символ '%' для указания любого значения любой длины и символ '_' (подчеркивания) для указания любого единичного символа. Например, указание ограничения

CREATE TABLE TBL (CHECK (STOLBEZ LIKE "%USD"));

читается так: вводимое в столбец значение должно оканчиваться символами •USD', независимо от того, какие символы и сколько расположены перед ними;

указание же ограничения CREATE TABLE TBL(CHECK (STOLBEZ LIKE "_94");) ;

означает, что вводимое в столбец значение может содержать 4 символа, из которых первые два - любые и последние два - '94'.

ESCAPE <значение> используется, если в операторе LIKE символы "%" или '_' должны использоваться в шаблоне подобия. В этом случае выбирается некоторый символ, например '!', после которого символы '%', '_' входят в поисковую строку как непосредственно поисковые символы. В этом случае символ '!' указывается после слова ESCAPE, например:

CREATE TABLE TBL(CHECK(STOLBEZ LIKE "%!%" ESCAPE "!"););

<значение> {= | < | >} | >= | <=} {ALL | SOME | ANY} (<выбор_иногих>) определяет, что значение столбца больше, меньше и т.д. всех (ALL) или некоторых (SOME или ANY), значений в списке выбор_многих. Список значений выбор_иногих выдается как результат выполнения оператора SELECT по отношению к од но и или нескольким таблицам БД.

Пример. Пусть определены таблицы TOVAR и PRIHOD:

CREATE TABLE TOVAR ( TOVAR VARCHAR(20) CHARACTER SET WIN1251 NOT NULL

COLLATE PXW_CYRL, PRIMARY KEY (TOVAR) );

CREATE TABLE PRIHOD ( ID_PR INTEGER NOT NULL,

TOVAR VARCHAR(20) CHARACTER SET WIN1251 NOT NULL

COLLATE PXW_CYRL,

DATE_PRIH DATE NOT NULL,

KOLVO_P INTEGER NOT NULL,

PRIMARY KEY (ID_PR)

CONSTRAINT PRIHOF_TOVAR

FOREIGN KEY (TOVAR) REFERENCES TOVAR(TOVAR)

) ;

Определим таблицу RASHOD, у которой дата расхода товара DATE_RASH больше всех дат прихода данного товара DATE_PRIH в таблице PRIHOD:

CREATE TABLE RASHOD (ID_RS INTEGER NOT NULL,

TOVAR VARCHAR(20).CHARACTER SET WIN1251 NOT NULL

COLLATE PXW_CYRL,

DATE_RASH DATE NOT NULL,

KOLVO_R INTEGER NOT NULL,

PRIMARY KEY (ID_RS),

CONSTRAINT RASH_TOVAR

FOREIGN KEY (TOVAR) REFERENCES TOVAR(TOVAR),

CONSTRAINT PO_DATE_RASH

CHECK ( DATE_RASH > ALL

SELECT DATE_PRIH

FROM PRIHOD

WHERE PRIHOD.TOVAR = RASHOD.TOVAR)));

Как видно, в операторе SELECT в предложении WHERE указана только таблица PRIHOD. Таблица RASHOD в предложении WHERE не указана, но подразумевается, поскольку именно на нее наложено ограничение PO_DA ТЕ. Кроме того, в этом случае условие выборки WHERE PRIHOD.TOVAR = RASHOD.TOVAR подразумевает текущее значение RASHOD. TOVAR, т.е. значение, введенное в добавляемую запись таблицы RASHOD, - запись, значение столбца DA TE_RASH которой и проверяется на соответствие условию, заданному в CHECK в ограничении CONSTRAINT PO_DA TE_RASH. Указание в предложении WHERE обеих таблиц, FROM PRIHOD, RASHOD приведет к тому, что условие WHERE PRIHOD.TOVAR = RASHOD.TOVAR будет воспринято как внутреннее соединение таблиц PRIHOD и RASHOD по столбцу ТОVAR. В этом случае соединение будет произведено для всех значений столбца TOVAR в таблице RASHOD, а не для текущего значения той записи таблицы RASHOD, чье значение DA TE_RASH проверяется на соответствие условию.

EXISTS (<выражение_вь1бора>) - возвращает True, если список выражение„выбора непустой, т.е. содержит хотя бы одну строку. Список выражение_выбора выдается как результат выполнения оператора SELECT по отношению к одной или нескольким таблицам БД.

В приводимом ниже примере обязательно существование хотя бы одной записи в таблице PRIHOD с таким же значением столбца TOVAR, что и в поле TOVAR записи таблицы RASHOD.

CREATE TABLE RASHOD (ID_RS INTEGER NOT NULL,

TOVAR VARCHAR(20) CHARACTER SET WIN1251 NOT NULL

COLLATE PXW_CYRL,

DATE_RASH DATE NOT NULL,

CONSTRAINT RASH_TOVAR

FOREIGN KEY (TOVAR) REFERENCES TOVAR(TOVAR),

CONSTRAINT PO_DATE_RASH

CHECK (EXISTS (SELECT TOVAR FROM PRIHOD

WHERE PRIHOD.TOVAR = RASHOD.TOVAR))

);

SINGULAR (<выражение_вь1бора>) - возвращает True, если список выражение_выбора содержит только одну строку. Список выражение_выбора выдается как результат выполнения оператора SELECT по отношению к одной или нескольким таблицам БД.

В приводимом ниже примере обязательно существование единственной записи в таблице PRIHOD с таким же значением столбца TOVAR, что и в поле TOVAR записи таблицы RASHOD.

CREATE TABLE RASHOD (ID_RS INTEGER NOT NULL,

TOVAR VARCHAR(20) CHARACTER SET WIN1251 NOT NULL

COLLATE PXW_CYRL,

DATE_RASH DATE NOT NULL,

CONSTRAINT RASH_TOVAR

FOREIGN KEY (TOVAR) REFERENCES TOVAR(TOVAR),

CONSTRAINT PO__DATE_RASH

CHECK (SINGULAR(SELECT TOVAR FROM PRIHOD

WHERE PRIHOD.TOVAR = RASHOD.TOVAR))

);

<значение> CONTAINING <значение1> определяет, что значение столбца должно содержать вхождение значение1, не важно в каком месте.

В приводимом ниже примере поле значение STOLBEZ должно содержать вхождение символов 'USD', независимо от того, какие символы и в каком количестве расположены перед ними или после них.

CREATE TABLE TBL(CHECK (STOLBEZ CONTAINING "USD"));

<значение> STARTING [WITH] <значение1> определяет, что значение столбца должно начинаться с символов значение1.

В приводимом ниже примере поле значение STOLBEZ должно начинаться с символов 'USD'.

CREATE TABLE TBL (CHECK (STOLBEZ STARTING WITH "USD")) ;

• Может быть задана комбинация условий, которым должно соответствовать значение. В этом случае отдельные условия соединяются операторами AND или OR.

• Для многих из приведенных условий (см. формат CHECK) может быть выдано отрицание при помощи слова NOT. Например:

CHECK(NOT STOLBEZ1 > STOLBEZ2);

• В качестве <значение> можно указывать имя столбца, константу, выражение, функцию.

• В качестве функций могут использоваться:

• COUNT - счетчик повторения;

• SUM - сумма;

• AVG - среднее значение;

• МАХ - максимальное значение;

• MIN - минимальное значение;

• CAST - приведение типов;

• UPPER - приведение всех букв к заглавным;

• GEN_ID - возвращает уникальное значение генератора.

22.9. Изменение объявления таблиц

Оператор ALTER TABLE позволяет:

• добавить определение нового столбца;

• удалить столбец из таблицы;

• удалить атрибуты целостности таблицы или отдельного столбца;

добавить новые атрибуты целостности.

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

Пример. Пусть имеется таблица

CREATE TABLE SOTR(ID_SOTR INTEGER NOT NULL PRIMARY KEY,

FIO CHAR(10) COLLATE PXW_CYRL,

OTDEL VARCHAR(lO) COLLATE PXW_CYRL,

DOLJNOST CHAR(10) COLLATE PXW_CYRL

);

Пусть необходимо изменить характеристики столбца FIO, изменив тип столбца с CHAR(IO) на VARCHAR(25). Тогда:

1. Добавляем в таблицу новый временный столбец FIO_TMP, полностью повторяющий характеристики изменяемого столбца FIO:

ALTER TABLE SOTR

ADD FIO_TMP CHAR(10) CHARACTER SET WIN1251

COLLATE PXW_CYRL;

2. Копируем данные из FIO в FIO_TMP:

UPDATE SOTR

SET FIO_TMP = FIO;

3. Удаляем столбец FIO:

ALTER TABLE SOTR

DROP FIO;

4. Создаем новый столбец FIO с необходимыми характеристиками:

ALTER TABLE SOTR

ADD FIO VARCHAR(25) COLLATE PXW_CYRL;

5. Переписываем данные из временного столбца FIO_TMP в новый столбец FIO:

UPDATE SOTR

SET FIO = FIOJTMP;

6. Удаляем временный столбец FIO_TMP:

ALTER TABLE SOTR

DROP FIO_TMP;

ЗАМЕЧАНИЕ. Следует помнить, что изменение характеристик столбца, а также удаление столбца может закончиться неудачей, если:

• столбец приобретает атрибуты PRIMARY KEY или UNIQUE, но старые значения в столбце нарушают требования уникальности данных;

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

• столбцу были приписаны ограничения целостности CHECK на уровне таблицы;

• столбец использовался в иных компонентах БД - в просмотрах, триггерах, в выражениях для вычисляемых столбцов.

Все вышесказанное свидетельствует о том, что в случае необходимости изменения атрибутов столбца или в случае удаления столбца, сначала необходимо тщательно проанализировать, какие последствия для таблицы и базы данных в целом может повлечь такое изменение или удаление.

22.10. Изменение атрибутов столбца

Добавление нового столбца в таблицу БД производится оператором

ALTER TABLE <имя таблицы> ADD <определения столбца>;

Добавление новых ограничений целостности производится оператором

ALTER TABLE <имя таблицы> ADD [CONSTRAINT <имя ограничения>] <определения целостности>;

Удаление столбца (столбцов) из таблицы производится оператором

ALTER TABLE <имя таблицы> DROP <имя столбца1>[,<имя столбца2>.. . ] ;

Удаление ограничений целостности (уровень таблицы) производится оператором

ALTER TABLE <имя таблицы> DROP <имя ограничения целостности>;

Пример. Для таблицы PRIHOD

CREATE TABLE PRIHOD(ID_PRIHOD INTEGER NOT NULL PRIMARY KEY,

DATAPRIH DATE NOT NULL,

TOVAR VARCHAR(20) NOT NULL COLLATE PXW_CYRL,

KOLVO INTEGER NOT NULL,

CONSTRAINT PO_TOVARU

FOREIGN KEY(TOVAR) REFERENCES SPR_TOVAR

) ;

удалить целостность PO_TOVARU: ALTER TABLE PRIHOD DROP PO_TOVARU;

ЗАМЕЧАНИЕ. В случае необходимости непоименованной целостности придется использовать ее системное имя. Его можно узнать из системной таблицы БД с именем RDB$RELATION_CONSTRAINTS.

22.11. Удаление таблицы

Удаление таблицы целиком производится оператором DROP TABLE <имя таблицы>;

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