Уникальные индексы Oracle - PullRequest
       18

Уникальные индексы Oracle

3 голосов
/ 14 апреля 2010

Сегодня я создавал новую таблицу в 10g, когда заметил интересное поведение. Вот пример того, что я сделал:

CREATE TABLE test_table ( field_1 INTEGER PRIMARY KEY );

По умолчанию Oracle создаст ненулевой уникальный индекс для первичного ключа. Я дважды проверил это. После быстрой проверки я нахожу уникальное индексное имя SYS_C0065645. Пока все работает как положено. Теперь я сделал это:

CREATE TABLE test_table ( field_1 INTEGER,
CONSTRAINT pk_test_table PRIMARY KEY (field_1) USING INDEX (CREATE INDEX idx_test_table_00 ON test_table (field_1)));

После описания моего недавно созданного индекса idx_test_table_00 я вижу, что он не уникален. Я попытался вставить дублирующиеся данные в таблицу и был остановлен ограничением первичного ключа, доказав, что функциональность не была затронута. Мне кажется странным, что Oracle позволил бы использовать неуникальный индекс для ограничения первичного ключа. Почему это разрешено?

Ответы [ 3 ]

5 голосов
/ 15 апреля 2010

На самом деле нет никакой структурной разницы между уникальным индексом и неуникальным индексом, Oracle может использовать любой из них для ограничения PK. Одно из преимуществ такого определения PK, как это, состоит в том, что вы можете отключить или отложить ограничение для загрузки данных - это невозможно с уникальным индексом, поэтому можно утверждать, что эта реализация более гибкая.

2 голосов
/ 15 апреля 2010

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

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

  • проверить PK
  • помочь запросу работать лучше

Oracle по умолчанию создаст ненулевой уникальный индекс

О, и индекс не имеет ничего общего с ненулевым аспектом.

1 голос
/ 15 апреля 2010

см. отличная статья о неуникальных индексах, контролирующих первичные ключи . Автор Richard Foote. Ричард показывает, что вы получите удар по производительности при использовании неуникального индекса.

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

...