Шрифт:
Интервал:
Закладка:
До удаления столбца учтите условия, при которых невозможно будет выполнить удаление. Удаление будет ошибочным, если столбец:
* является частью ограничения 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, которые были добавлены в процессе определения таблицы, могут быть удалены без каких-либо осложнений. Условия 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);
или
ALTER TABLE EMPLOYEE
ADD EMAIL_ID VARCHAR(IO) NOT NOLL UNIQUE,
ADD LEAVE_STATUS DEFAULT 10 INTEGER NOT NULL;
Добавление новых ограничений таблицыПредложение ADD CONSTRAINT может быть использовано для добавления ограничений на уровне таблицы для нового или существующего столбца.
Синтаксис:
ALTER TABLE имя ADD [CONSTRAINT ограничение] <ограничение-таблицы>;
где ограничение-таблицы- может быть ограничением PRIMARY KEY, FOREIGN KEY, UNIQUE или CHECK. Фраза CONSTRAINT ограничение может быть опущена, если вам не нужно имя ограничения.
ПримерДля добавления ограничения UNIQUE в таблицу EMPLOYEE вы можете использовать следующий оператор:
ALTER TABLE EMPLOYEE
ADD CONSTRAINT UQ_PHONE_EXT UNIQUE(PHONE_EXT);
Когда недостаточно ALTER TABLE
Иногда бывает нужным произвести изменение столбца, которое нельзя совершить с помощью ALTER TABLE. Примером может быть случай, когда столбец, хранящий международные элементы языка, имеет набор символов NONE, который нужно заменить на другой набор символов, чтобы исправить ошибку проектирования, или телефонный номер, определенный вначале кем-то как целое, нужно заменить на 18-символьный столбец.
В первом случае невозможно изменить набор символов для столбца, следовательно, вам нужно средство, чтобы сохранить данные и сделать их доступными в правильном наборе символов. Во втором случае простое изменение типа данных столбца с телефонным номером не будет работать, если у нас уже существуют целые числа в этом столбце. Мы хотим сохранить существующие числа, но нам нужно преобразовать их в строки. Это не может быть выполнено в существующей структуре, потому что столбец с целым типом данных не может хранить строки.
Прием заключается в создании в таблице временного столбца с правильными атрибутами и переносе туда данных, после чего вы удалите и пересоздадите нужный столбец.
1. Добавьте в таблицу временный столбец с теми атрибутами, которые вам нужны.
ALTER TABLE PERSONNEL
ADD TEMP_COL VARCHAR (18) ;
COMMIT;
2. Скопируйте данные из столбца, который вы будете изменять, во временный столбец, преобразовывая их соответствующим образом (например, изменяя набор символов для конвертирования текстовых данных в правильный набор символов или, как в нашем примере, выполняя преобразование).
UPDATE PERSONNEL
SET TEMP_COL = CAST(TEL_NUMBER AS VARCHAR(18))
WHERE TEL_NUMBER IS NOT NULL;
COMMIT;
3. После проверки того, что данные во временном столбце были изменены, как планировалось, удалите старый столбец.
ALTER TABLE PERSONNEL DROP TEL_NUMBER;
4. Создайте "новый" столбец, с тем же именем, как и тот, который вы только что удалили, и с теми же атрибутами, что и у временного столбца.
ALTER TABLE PERSONNEL
ADD TEL_NUMBER VARCHAR (18);
5. Скопируйте данные во вновь созданный столбец.
UPDATE PERSONNEL
SET TEL_NOMBER = TEMP_COL WHERE TEMP_COL IS NOT NULL;
COMMIT;
6. После проверки того, что данные во вновь созданном столбце правильные, удалите временный столбец. Если хотите, вы можете также переместить пересозданный столбец на его старую позицию.
ALTER TABLE PERSONNEL
DROP COLUMN TEMP_COL,
ALTER TEL_NUMBER POSITION 6;
COMMIT;
Удаление таблицы
DROP TABLEИспользуйте оператор DROP TABLE для удаления таблицы и ее данных из базы данных.
Это полное удаление, оно не может быть отменено после подтверждения транзакции.
DROP TABLE имя;
Следующий оператор удаляет таблицу PERSONNEL:
DROP TABLE PERSONNEL;
RECREATE TABLE
Иногда бывает нужно удалить таблицу и снова создать ее "с нуля". Для таких случаев Firebird имеет оператор RECREATE TABLE, который делает следующее:
* удаляет существующую таблицу и все принадлежащие ей объекты;
* подтверждает изменения;
* создает новую таблицу в соответствии с указанной спецификацией.
СинтаксисСинтаксис RECREATE TABLE идентичен синтаксису оператора CREATE TABLE. Просто замените ключевое слово CREATE на RECREATE.
! ! !
ВНИМАНИЕ! Убедитесь, что вы сохранили исходные тексты триггеров, ключей и индексов этой таблицы до выполнения запроса RECREATE TABLE!
. ! .
Ограничения и рекомендацииЕсли при выполнении оператора DROP или RECREATE таблица находится в использовании, запрос не будет выполнен, появится сообщение "Object xxxxx is in use" (Объект xxxxx используется).
Всегда выполняйте резервное копирование перед любыми действиями, изменяющими метаданные.
Хотя возможно изменение метаданных при наличии соединенных пользователей, этого делать не рекомендуется, особенно в случаях радикальных изменений типа удаления или пересоздания таблиц. Если нужно, отключите пользователей и получите исключительный доступ. Инструкции по получению исключительного доступа см. в главе 39.
- Delphi. Учимся на примерах - Сергей Парижский - Программирование
- Сделай видеоигру один и не свихнись - Слава Грис - Программирование / Руководства
- Психбольница в руках пациентов - Алан Купер - Программирование