Язык определения данных, страница 5

SQL> SELECT constraint_name, constraint_type FROM user_constraints

  2  WHERE table_name IN ('T1', 'T2');

no rows selected

SQL> ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (first);

Table altered.

SQL> ALTER TABLE t1 ADD CONSTRAINT t1_second_ck CHECK (second>1000);

Table altered.

SQL> ALTER TABLE t2 ADD CONSTRAINT t2_first_fk FOREIGN KEY (first)

  2  REFERENCES t1(first);

Table altered.

SQL> SELECT constraint_name, constraint_type FROM user_constraints

  2  WHERE table_name IN ('T1', 'T2');

CONSTRAINT_NAME                C

------------------------------ -

T1_PK                          P

T1_SECOND_CK                   C

T2_FIRST_FK                    R

SQL> ALTER TABLE t1 DROP CONSTRAINT t1_second_ck;

Table altered.

Если Вы попытаетесь удалить ограничение, которое имеет зависимые ограничения, сервер Oracle вернет ошибку. Используйте ключевое слово CASCADE, если хотите удалить ограничение вместе со всеми зависимыми ограничениями.

SQL> ALTER TABLE t1 DROP PRIMARY KEY;

ALTER TABLE t1 DROP PRIMARY KEY

*

ERROR at line 1:

ORA-02273: this unique/primary key is referenced by some foreign keys

SQL> ALTER TABLE t1 DROP PRIMARY KEY CASCADE;

Table altered.

SQL> SELECT constraint_name, constraint_type FROM user_constraints

  2  WHERE table_name IN ('T1', 'T2');

no rows selected

Разрешение и запрет ограничений

Действие ограничения можно временно запретить, например, для ускорения загрузки большого количества строк. После выполнения операции, которую может сильно замедлить проверка ограничений, действие ограничений можно опять разрешить. Для запрета и разрешения ограничений используются ключевые слова DISABLE и ENABLE.

ALTER TABLE [схема.]таблица DISABLE | ENABLE CONSTRAINT ограничение [CASCADE];

При разрешении ограничений UNIQUE и PRIMARY KEY автоматически создаются соответствующие индексы. Запретить и разрешить действие ограничения можно, также, при создании таблицы командой CREATE TABLE. Для запрета всех зависимых ограничений используйте ключевое слово CASCADE.

SQL> SELECT constraint_name, constraint_type, status

  2  FROM user_constraints WHERE table_name IN ('T1', 'T2');

CONSTRAINT_NAME                C STATUS

------------------------------ - --------

T1_PK                          P ENABLED

T2_FIRST_FK                    R ENABLED

SQL> ALTER TABLE t1 DISABLE CONSTRAINT t1_pk CASCADE;

Table altered.

SQL> SELECT constraint_name, constraint_type, status

  2  FROM user_constraints WHERE table_name IN ('T1', 'T2');

CONSTRAINT_NAME                C STATUS

------------------------------ - --------

T1_PK                          P DISABLED

T2_FIRST_FK                    R DISABLED

Если Вы разрешаете ограничения, все данные в таблице должны ему соответствовать. В противном случае сервер Oracle вернет ошибку. Например, пустая таблица t1 имеет первичный ключ. Таблица t2 имеет колонку, на которую наложено ограничение внешнего ключа, ссылающееся на таблицу t1. Запрещение действия ограничения внешнего ключа позволило вставить в таблицу t2 строки, содержащие внешний ключ, значения которого не соответствуют ни одному значению первичного ключа в таблице t1. Однако при попытке разрешить ограничение внешнего ключа сервер Oracle выдает ошибку, сообщающую о том, что родительский ключ для ограничения не найден.

SQL> SELECT * FROM t1;

no rows selected

SQL> SELECT * FROM t2;

    FIRST NAME

--------- --------------------

        1 One

        2 Two

SQL> ALTER TABLE t1 ENABLE CONSTRAINT t1_pk;

Table altered.

SQL> ALTER TABLE t2 ENABLE CONSTRAINT t2_first_fk;

ALTER TABLE t2 ENABLE CONSTRAINT t2_first_fk

                                 *

ERROR at line 1:

ORA-02298: cannot validate (INSTRUCTOR.T2_FIRST_FK) - parent keys not found

SQL> INSERT INTO t1 VALUES (1, 1);

1 row created.

SQL> INSERT INTO t1 VALUES (2, 2);

1 row created.

SQL> ALTER TABLE t2 ENABLE CONSTRAINT t2_first_fk;

Table altered.

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

Для удаления таблицы используется команда языка определения данных DROP TABLE. Сервер не запрашивает подтверждения команды при удалении таблицы, отменить команду невозможно, поэтому будьте особенно осторожны при выполнении этой операции. Удалить таблицу может только владелец или пользователь с привилегией DROP ANY TABLE.

DROP TABLE [схема.]таблица [CASCADE CONSTRAINTS];

§  Из таблицы удаляются все данные

§  Удаляются все индексы и представления, связанные с таблицей

§  Удаляется определение таблицы из словаря данных

§  Параметр CASCADE CONSTRAINTS удаляет все зависимые ограничения (не строки в зависимых таблицах, а только ограничения)

SQL> SELECT constraint_name, constraint_type, status

  2  FROM user_constraints WHERE table_name IN ('T1', 'T2');

CONSTRAINT_NAME                C STATUS

------------------------------ - --------

T1_PK                          P ENABLED

T2_FIRST_FK                    R ENABLED

SQL> DROP TABLE t1;

DROP TABLE t1

           *

ERROR at line 1:

ORA-02449: unique/primary keys in table referenced by foreign keys

SQL> DROP TABLE t1 CASCADE CONSTRAINTS;

Table dropped.

SQL> SELECT constraint_name, constraint_type, status

  2  FROM user_constraints WHERE table_name IN ('T1', 'T2');

no rows selected

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

Для переименования таблицы используется команда языка определения данных RENAME.

RENAME старое_имяTO новое_имя;

Усечение таблицы

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

TRUNCATE TABLE таблица;

Литература

1.  Вильям Дж. Пэйдж Использование Oracle8/8i: пер. с англ. – М.: Издательский дом "Вильямс", 1999.

2.  Джудит С.Боуман и др. Практическое руководство по SQL/ 3-е издание: пер. с англ. – К.:  Диалектика, 1997.