14 мая 2011 г.

oracle: Создание индексов связанных с ограничением целостности

Oracle обеспечивает выполнение ограничения целостности UNIQUE или PRIMARY KEY для таблицы, создавая уникальный индекс для уникального или первичного ключа. Этот индекс создается автоматически, когда включается ограничение целостности. Когда выполняется CREATE TABLE или ALTER TABLE, для создания индекса не надо предпринимать никаких действий, но при желании можно указать предложение USING INDEX, чтобы контролировать его создание.
Чтобы включить ограничение целостности UNIQUE или PRIMARY KEY, создавая таким образом связанный с ним индекс, владелец таблицы должен иметь квоту табличного пространства, где будет храниться этот индекс, или системную привилегию UNLIMITED TABLESPACE. Индекс связанный с ограничением целостности всегда получает имя этого ограничения, если вы не укажете иное.

 
Параметры хранения для индексов связанных с ограничением целостности UNIQUE или PRIMARY KEY, можно устанавливать с помощью предложения USING INDEX.

Следующий пример CREATE TABLE включает ограничение целостности PRIMARY KEY и задает параметры хранения связанного с ним индекса:
CREATE TABLE ALL_ORACLE_USERS (
    ID NUMBER(5) PRIMARY KEY
 ...
 LOCKED INTEGER)
 ENABLE PRIMARY KEY USING INDEX
 TABLESPACE ALL_ORACLE_IDX_TBS
 PCTFREE 0;

Если требуется более явное управление индексами, связанными с ограничением целостности UNIQUE или PRIMARY KEY, то Oracle позволяет:
  • Указывать существующий индекс, который Oracle должен использовать для обеспечения выполнения ограничения целостности.
  • Указывать оператор создания индекса, который Oracle должен использовать, чтобы создать индекс и обеспечить выполнение ограничения целостности.
Эти возможности задаются с помощью предложения USING INDEX. Это продемонстрировано в следующих примерах:

CREATE TABLE TEST (
    COL1 INT PRIMARY KEY USING INDEX (CREATE INDEX TEST_IDX ON TEST (COL1)));

 
CREATE TABLE TEST (
    COL1 INT,
 COL2 INT,
 CONSTRAINT TESTU1 UNIQUE (COL1, COL2)
     USING INDEX (CREATE UNIQUE INDEX TEST_IDX ON TEST (COL1, COL2)),
 CONSTRAINT TESTU2 UNIQUE (COL2, COL1) USING INDEX TEST_IDX);

 
CREATE TABLE TEST (
    COL1 INT,
 COL2 INT);
 

CREATE INDEX TEST_IDX ON TEST (COL1, COL2);
ALTER TABLE TEST ADD CONSTRAINT TEST_CON PRIMARY KEY (COL1) USING INDEX TEST_IDX;

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