Команда ALTER TABLE предназначена для изменения структуры уже существующих таблиц.

Она позволяет:

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

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

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

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

В одной команде ALTER TABLE можно задать любое число изменений. Внесение изменений разрешено ее создателю, а также пользователям, имеющим права системного администратора (SYSDBA или другого пользователя с аналогичными правами).

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

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

Удаление столбца из таблицы Из таблицы можно удалить столбец только в том случае, если он не используется ни в каких ограничениях. Таковыми могут быть СНЕСК,-конструкции по таблицам, индексы, а также триггеры и хранимые процедуры. Поэтому прежде чем удалить столбец необходимо удалить все ограничения, в которых этот столбец фигурирует, в том числе и относящиеся совсем к другим таблицам (например, внешние ключи или триггеры). Изменение формата столбца Стандартный синтаксис команды ALTER TABLE вообще не предполагает возможности изменения столбца. Поэтому изменение предполагает, по крайней мере, две команды ALTER TABLE. Первая - удалить столбец и вторая - добавить столбец. При выполнении этих операций следует руководствоваться замечаниями по добавлению и удалению. Следует, конечно, помнить, что удаление столбца влечет полную потерю хранящихся в нем данных. Если эти данные необходимо сохранить, то операция замены распадается на следующие:

• добавить новый столбец с тем же типом данных, что и в изменяемом столбце (ALTER TABLE ADD ...);

• скопировать данные из существующего столбца в новый (UPDATE...);

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

• выполнить удаление существующего столбца (ALTER TABLE DROP...);

• создать столбец с именем удаленного и новыми характеристиками (ALTER TABLE ADD ...);

• скопировать данные из столбца-копии в столбец с измененными характеристиками (UPDATE ...=CAST(...)...);

• удалить столбец-копию (ALTER TABLE DROP ...);

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

• воскликнуть ура, все получилось!

Добавление ограничений Добавление ограничений не требует никаких вспомогательных действий. Необходимо только в случае добавления нескольких ограничений соблюдать порядок их добавления.

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

Команда ALTER TABLE имеет следующий синтаксис:

JU,TER TABLE table LIST_<operation:»;

coperation> ::= {ADD <col_def>

/ ACD <tconstraint>

J DROP col

/ DROP CONSTRAINT constraint.?

<COl_def> = col {<datatype> / COMPUTED [BY] {< expr>) /

domain^

/DEFAULT fliteral / NUEL / USER}]

/■not null;

/<col_constraint>;

/•COLLATE collation./

< datatype> ::= {

SMALLEST / INTEGER / FLOAT / DOUBLE PRECISION;

f<array_dim>]

I {DECIMAL / NUMERIC; [{ precision [, scale7 ))

/■<array_dim>;

/ ("DATE / TIME / TIMESTAMP} [ <array_dim>;

/ (CHAR /CHARACTER / CHARACTER VARYING / VARCHAR;

[( int) I /'<array_dim>7 [CHARACTER SET charnameJ / fNCHAR / NATIONAL CHARACTER / NATIONAL CHAR}

/varying; [{ int); [ <array_dim>;

/ BLOB [ SUB_TYPE / int / subtype_name} ] /’SEGMENT SIZE int; [CHARACTER SET charname;

/ BLOB [( seglen [, subtype;);

J

<array_dim> [LlST_<dims>]

<dims> [x: ]y

< expr> = Любое допустимое в SQL выражение, дающее в результате единственное значение.

<col_constraint> ;:= [CONSTRAINT constraint; <con-straint_def>

<Constraint_def> {UNIQUE / PRIMARY KEY

/ REFERENCES othertable [(LJST_Other_COl)]}

fON DELETE {NO ACTION / (ASCADI / SET DEFAULT / SET NULL;;

fON UPDATE {NO ACTION / ( ASCADI / SET DEFAULT / SET NULL} ]

I CHECK ( <search_condition>)

<tconstraint> ;;= /'CONSTRAINT constraint;

{ /PRIMARY KEY / UNIQUE} (LIST_col)

I FOREIGN KEY (LJST_col) REFERENCES Other_table

[ON DELETE (NO ACTION / CASCADE / SET DEFAULT / SET NULL}]

[ON UPDATE /NO ACTION / CASCADE / SET DEFAULT / SET NULL}]

/ CHECK ( <search_condition>)}

<search_condition> =

{ <val> <operator> { <val> / ( <select_one>)}

I <val> [NOT] BETWEEN <val> AND <val>

/ <val> [NOT] LIKE <val> /'ESCAPE <val>]

/ <val> [NOT] IN ( <val> [ , <val> ...] / <select_list>)

/ <val> IS /нот; NULL

/ <val> {>= I <=} I [NOT] {= j < j >}

{ALL / SOME / any; (<select_list>)

/ EXISTS ( <select_expr>)

/ SINGULAR ( <select_expr>)

/ <val> [NOT] CONTAINING <val>

/ <val> [NOT] STARTING /WITH] <val> ,

/ ( <search_condition>) ■

/ NOT <search_condition>

/ <search_condition> OR <search_condition>

/ <search_condition> AND <search_condition>;

<val> = {

col f<array_dim>] / : variable / <constant> / <expr> / <function>

/ udf {[ <val> [, <val> ...]])

I NULL / USER / RDB$DB__KEY / ?

/COLLATE collation]

<constant> = / ' string' / charsetname ' string'

<function> = {

COUNT (* / fALLj <val> / DISTINCT <val>)

/ SUM ([ALL] <val> / DISTINCT <val>)

/ AVG (/ALL] <val> / DISTINCT <val>)

/ MAX (/ALL; <val> / DISTINCT <val>)

/MIN (/"ALL; <val> / DISTINCT <val>)

/ CAST ( <val> AS <datatype>)

/ UPPER ( <val>) .

/ GEN_ID ( generator, <val>)

;.ALTER TABLE

<operator> = {= /< /> /<= />= /!</!> /<> / '• = }

<select_one> = SELECT, возвращающий одну строку с одним столбцом.

<select list> = SELECT, возвращающий несколько (возможно, PI строк с одним столбцом.

<select_pxpr> = SELECT, возвращающий несколько (возможно, 0) строк с несколькими столбцами.

Из описания синтаксиса видно, что элементы синтаксиса операции ADD полностью соответствуют аналогичным элементам описания столбцов или ограничений при создании таблиц (CREATE TABLE). В результате ее выполнения создается соответствующий элемент описания таблицы. Операция ADD может завершиться безуспешно, если:

• пользователь, выдавший команду, не имеет соответствующих прав;

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

Операция DROP обеспечивает удаление указанного в ней элемента. Ее синтаксис достаточно прост и не нуждается в пояснении. В то же время необходимо отметить, что операция DROP может завершиться безуспешно, если:

• пользователь, выдавший команду, не имеет соответствующих прав;

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

• делается попытка удалить столбец, входящий в ограничения CHECK;

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

• делается попытка удалить столбец, входящий в ограничения CHECK, вычисляемый столбец или триггер других таблиц.

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

Добавление столбцов Пример добавления столбцов уже приводился, когда говорилось о вычисляемых столбцах (см. пример 4.10). Рассмотрим этот же пример, объединив обе команды в одну.

Пример 4.14

alter TABLE TBOOK_AUTHOR ■

add B1 varchar(60) COMPUTED BY ((select a.auname from tau-> thor a

where a.author=tbook_author.author)) ,

add В2 COMPUTED BY ((select a. booknm from tbook a where a.unikey=tbook_author.bookkey));

Добавление ограничений Приведем пример.

Пример 4.15

ALTER TABLE TBOOK_AUTHOR ADD CONSTRAINT UK__BOOK_AUTHOR UNIQUE (AUTHOR, BOOKKEY);

Удаление столбцов Рассмотрим удаление только что добавленных столбцов.

Пример 4.16

alter TABLE TBOOK_AUTHOR drop Bl, drop B2;

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

Удаление ограничений Приведем пример.

Пример 4.17

ALTER TABLE TBOOK_AUTHOR drop CONSTRAINT UK_BOOK_AUTHOR ;

4.3. таблицы | Введение в InterBase | Удаление таблиц. команда drop table


Введение в InterBase



Новости за месяц

  • Апрель
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс