Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
Firebird не позволит вам изменить тип данных столбца или домена, в результате чего могут потеряться данные.
* Новое определение столбца должно позволять использовать существующие данные. Если, например, новый тип данных имеет слишком много байтов, или не поддерживается преобразование типов данных, то возвращается ошибка, и изменения не выполняются.
* Когда числовые типы преобразуются в строковый тип, каждый числовой тип рассматривается как предмет с минимальной длиной в байтах в соответствии с типом (см. рис. 8.1).
* Преобразование символьных данных в несимвольные недопустимо.
* Столбцы
! ! !
ВНИМАНИЕ! Любые изменения определения полей могут потребовать пересоздания индексов.
. ! .
Удаление столбцов
Владелец таблицы может использовать ALTER TABLE для удаления определения столбца и его данных из таблицы. Удаление столбца приводит к потере всех хранимых в нем данных. Удаление приводит к немедленному эффекту, независимо от других транзакций, работающих с таблицей. В этом случае другая транзакция продолжается без прерывания, a Firebird откладывает удаление до освобождения таблицы.
До удаления столбца учтите условия, при которых невозможно будет выполнить удаление. Удаление будет ошибочным, если столбец:
* является частью ограничения UNIQUE, PRIMARY KEY или FOREIGN KEY;
* включен в ограничение CHECK (это могут быть ограничения CHECK на уровне таблицы для основанного на домене столбца в дополнение к ограничению его домена);
* используется в просмотре, триггере или хранимой процедуре.
Зависимости должны быть удалены до удаления столбца. Столбцы, включенные в состав ограничений PRIMARY KEY и UNIQUE, не могут быть удалены, если на них есть ссылки в ограничениях FOREIGN KEY. В этом случае удалите ограничение FOREIGN KEY до удаления ограничения PRIMARY KEY или UNIQUE. После этого удаляйте столбец.
Синтаксис:
ALTER TABLE имя-таблицы DROP имя-столбца [, имя-столбца ...];
Например, следующий оператор удаляет столбец JOB_GRADE из таблицы EMPLOYEE:
ALTER TABLE EMPLOYEE DROP JOB_GRADE;
Удаление нескольких столбцов в одном операторе:
ALTER TABLE EMPLOYEE
DROP JOB_GRADE,
DROP FULL NAME;
Удаление ограничений
Необходимо выполнять удаление ограничений в правильной последовательности, если ограничения PRIMARY KEY и CHECK имеют зависимости.
! ! !
СОВЕТ. Для поиска имен ограничений может оказаться полезным выполнение четырех системных просмотров, определенных в скрипте system_views.sql, представленном в приложении 9.
. ! .
Ограничения UNIQUE KEY и PRIMARY KEY
При удалении ограничений первичного и уникального ключа необходимо вначале найти и удалить все ссылающиеся на них ограничения внешних ключей. Если речь идет об уникальном ключе, то объявление внешнего ключа перечисляет имена столбцов уникального ключа, например:
. . .
FK_DATA_ID FOREIGN KEY DATA_ID
REFERENCES TEST_UQ (DATA_I D) ;
Если ключ, на который имеются ссылки, является первичным ключом, то имя столбца первичного ключа является необязательным в объявлениях внешнего ключа и часто опускается. Например,
посмотрите на базу данных ../samples/employee.gdb:...TABLE PROJECT (
. . . ,
TEAM_CONSTRT FOREIGN KEY(TEAM_LEADER)
REFERENCES EMPLOYEE );
Удаление ограничения внешнего ключа простое:
ALTER TABLE PROJECT
DROP CONSTRAINT TEAM_CONSTRT;
COMMIT;
После этого становится возможным удаление ограничения первичного ключа для столбца EMP_NO таблицы EMPLOYEE:
ALTER TABLE EMPLOYEE
DROP CONSTRAINT EMP_NO_CONSTRT ;
Любые условия CHECK, которые были добавлены в процессе определения таблицы, могут быть удалены без каких-либо осложнений. Условия CHECK, наследуемые от домена, являются более проблематичными. Для освобождения от ограничений домена необходимо выполнить операцию ALTER TABLE ALTER COLUMN ... TYPE для изменения типа данных столбца или указания другого домена.
Добавление столбца
Один или более столбцов можно добавить в таблицу в одном операторе при использовании предложения ADD. Каждое предложение ADD включает полное определение столбца. Используется тот же самый синтаксис, что и при определении столбца в операторе CREATE TABLE. Предложения ADD отделяются друг от друга запятыми.
Синтаксис:
ALTER TABLE таблица ADD <определение-столбца>
<определение-столбца> = столбец
{<тип данных> | [COMPUTED [BY] (<выражение>) | домен}
[DEFAULT {литерал \ NULL | USER} ]
[NOT NULL] [<ограничение-столбца>]
[COLLATE порядок-сортировки]
<ограничение-столбца> = [CONSTRAINT ограничение]
<определение -ограничения> [< ограничение-столбца>]
< определение -ограничения>=
PRIMARY KEY
| UNIQUE
| CHECK (<условие-поиска>)
| REFERENCES другая-таблица [(другой-столбец [,другой-столбец...])]
[ON DELETE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}]
[ON UPDATE {NO ACTION|CASCADE | SET DEFAULT | SET NULL}]
Следующий оператор добавляет столбец EMP_NO в таблицу EMPLOYEE С использованием домена EMPNO:
ALTER TABLE EMPLOYEE ADD EMP_NO EMPNO NOT NULL;
Здесь мы добавляем два столбца EMAIL_ID и LEAVE_STATUS в таблицу EMPLOYEE:
ALTER TABLE EMPLOYEE
ADD EMAIL_ID VARCHAR(10) NOT NULL,
ADD LEAVE_STATUS DEFAULT 10 INTEGER NOT NULL;
Ограничения целостности могут быть включены в столбцы, которые вы добавляете в таблицу. Например, ограничение UNIQUE может быть включено в столбец EMAIL_ID в предыдущем примере:
ALTER TABLE EMPLOYEE
ADD EMAIL_ID VARCHAR(10) NOT NULL,
ADD LEAVE_STATUS DEFAULT 10 INTEGER NOT NULL,
ADD CONSTRAINT UQ_EMAIL_ID UNIQUE(EMAIL_ID);
или