Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Изменение определения таблицы




 

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

· изменение имени таблицы;

· изменение имени существующего поля;

· добавление нового поля;

· удаление существующего поля;

· изменение типа существующего поля;

· изменение выражение для виртуального поля;

· создание нового ограничения;

· удаление существующего ограничения;

· изменение имени существующего ограничения;

· отключение и включение действия ограничений;

· изменение физических параметров размещения таблицы и т.д.

Работа с командой ALTER TABLE обладает рядом особенностей. Прежде всего, следует иметь в виду, что эти команды могут исполняться после того как таблицы создана и заполнена данными (собственно, для этой цели эта команда и предназначена). Поэтому изменение структуры существующей таблицы влияет на данные в строках. Попытки выполнения команд ALTER TABLE могут привести, прежде всего, к полной или частичной потере существующих данных, а с другой стороны – к невозможности выполнить эти изменения по различным причинам ввиду наличия данных.

Рассмотрим использования этой команды на приводимых ниже примерах, которые используют таблицу "Клиент(кп)", представляющую копию рассмотренной ранее таблицы "Клиент". Предполагается, что таблица "Клиент(кп)" была создана следующим способом:

Create table "Клиент(кп)" as Select * from "Клиент"

 

1. Переименование таблицы

 

ALTER TABLE "Все заказы(кп)"

RENAME TO "Все заказы(кп1)"

 

Аналогичный результат может быть получен следующим образом:

RENAME "Все заказы(кп)" TO "Все заказы(кп1)"

 

2. Добавление нового поля

 

ALTER TABLE "Клиент(кп)"

ADD ("Образование" CHAR(20))

 

При этом во всех строках таблицы значение добавленного поля будет пустым (NULL).

 

3. Удаление поля

 

ALTER TABLE "Клиент(кп)"

DROP ("Образование")

 

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

 

4. Переименование поля

 

ALTER TABLE "Клиент(кп)"

RENAME column "Образование" TO "Степень"

 

Наличие ограничений на выполнение этой команды не влияет.

 

5. Изменение типа поля

 

ALTER TABLE "Клиент(кп)"

MODIFY "Степень" NVARCHER2(20)

 

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

 

6. Установление значения по умолчанию

 

ALTER TABLE "Клиент(кп)"

MODIFY "Степень" DEFAULT 'отсутствует'

 

Данное действие не влияет на уже существующие строки.

 

7. Добавление нового поля со значением по умолчанию

 

ALTER TABLE "Клиент(кп)"

ADD ("Степень" NVARCHAR2(20)

DEFAULT 'отсутствует')

 

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

Теперь рассмотрим работу с ограничениями.

 

1. Добавление нового ограничения

 

ALTER TABLE "Клиент(кп)"

ADD CONSTRAINT "Клиент(кп)_Ф_С"

UNIQUE ("Имя", "Фамилия")

 

Обратите внимание, что, несмотря на то, что таблица "Клиент(кп)" содержит в точности те же данные и имеет те же самые поля, что и таблица "Клиент", но никакие ограничения в ней не определены. Ограничения при необходимости можно было бы определить (вместе с определением полями) в команде CREATE TABLE … AS, или добавить после создания таблицы при помощи команды ALTER TABLE.

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

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

Обратите так же внимание, что ограничение "Клиент(кп)_Ф_С" имеет другое имя, отличное от ограничения "Клиент_Ф_С" таблицы "Клиент", хотя и относится к другой таблице. Напомним, что имена ограничений должны быть уникальными в схеме вне зависимости от того, в какой таблице они определены, поскольку так же являются объектами схемы базы данных.

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

 

ALTER TABLE "Клиент(кп)"

DROP ("Имя") CASCADE CONSTRAINTS

 

Этот вариант команды позволяет удалить поле вместе со всеми наложенными на него ограничениями.

 

9. Изменение имени ограничения

 

ALTER TABLE "Клиент(кп)"

RENAME CONSTRAINT "Клиент(кп)_ТТ_С" TO

"Клиент(кп)_ТТ_Сheck"

 

(предполагается, что ограничение "Клиент(кп)_ТТ_С" уже создано).

 

10. Отключение ограничения

 

ALTER TABLE "Клиент(кп)"

MODIFY CONSTRAINT "Клиент(кп)_ТТ_Сheck"

DISABLE

 

Указанное ограничения остается в схеме базы данных, но его условие более не проверяется при модификации данных. Отключенные ораничения можно вновь включить, используя опцию modify … enable; при этом будет предварительно выполнена проверка всех записей.

 

11. Удаление ограничения

 

ALTER TABLE "Клиент(кп)"

DROP CONSTRAINT "Клиент(кп)_ТТ_Сheck"

 

 

Удаление таблиц

 

Для удаления SQL-таблиц используется команда DROP TABLE, например:

 

DROP TABLE "Клиент(кп)"

 

При удалении таблицы происходят следующие действия:

1. удаляются все строки таблицы;

2. из системного каталога удаляется определение таблицы;

3. Удаляются все связанные с этой таблицей объекты, а именно: ограничения, индексы и триггеры.

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

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

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

 

DROP TABLE "Клиент(кп)" CASCADE CONSTRAINTS

 

Интересным вопросом является, что же происходит с данными после удаления таблицы. В ранних версиях Oracle удаление таблицы было необратимым действием; единственным способом восстановления данных было восстановление базы данных с резервных копий. В современной системе поддерживается понятие корзины, в которую помещаются удаленные объекты базы данных и из которой эти объекты можно при необходимости восстановить.

Рассмотрим следующую последовательность команд, иллюстрирующих работу с корзиной:

 

CREATE TABLE ToDrop

(aaa NUMBER UNIQUE,

bbb CHAR(20));

- создание некоторой таблицы

 

DROP TABLE ToDrop

- удаление таблицы

 

SELECT OBJECT_NAME, ORIGINAL_NAME, OPERATION,

TYPE, CAN_UNDROP

FROM RECYCLEBIN

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

OBJECT_NAME ORIGINAL_NAME OPERATION TYPE CAN_UNDROP
BIN$RNddS4U3QZWepxPrpwXy6Q==$0 SYS_C0010464 DROP INDEX NO
BIN$D/N6f2YwS8G6sNmhbzTucg==$0 TODROP DROP TABLE YES

 

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

 

FLASHBACK TABLE ToDrop TO BEFORE DROP

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

 

Если необходимо удалить таблицу без помещения ее предварительно в корзину, следует использовать следующий вариант:

 

DROP TABLE ToDrop PURGE

Для очистки корзины можно вопользоваться командой PURGE RECYCLEBIN.

Команда FLASHBACK TABLE может использоваться и для восстновления таблицы к состоянию в некотрый момент времени. Однако восстновление объектов из корзины возможно не всегда; это связано с подробностями настройки сервера. Для более детального и полного описания работы с корзиной следует обращаться к документации.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...