Описание индексов таблицы. Атрибуты индексов |
Для описания индексов зарезервирована ключевая конструкция with index, после которой в круглых скобках через запятую перечисляются индексы таблицы. Индекс может иметь имя, уникальное для данной БД.Конструкция закрывается точкой с запятой.
<описание-индексов-таблицы> = with index (<описание-индекса> {, <описание-индекса>});
Необходимо описать все используемые индексы таблицы.
<описание-индекса> = [<имя-индекса> =] <сегмент-индекса> {, <сегмент-индекса>};
Описание индекса состоит из сегментов. Сегменты индекса разделяются запятой.
<имя-индекса> - идентификатор. Должен быть уникальным для данной БД.
<сегмент-индекса> = <имя-поля> [([seg] <атрибут-индекса> {, <атрибут-индекса>})]
<имя-поля> - идентификатор.
Оператор seg указывает на то, что следующее в описании индексов поле также является сегментом данного индекса.
<атрибут-индекса> = <атрибут-модификации> | <атрибут-уникальности> | <атрибут-регистров> | <атрибут-сортировки> | <атрибут-вхождения-нулевой-записи> | <длина-сегмента> | <смещение-сегмента> | <атрибут-счетчика-записей> | <атрибут-суррогатного-ключа> | <атрибут-журналирования>
Атрибуты индекса задают дополнительные условия.
<атрибут-модификации> = mod | nomod
mod (m) - модификация ключа разрешена.
nomod (nm) - модификация ключа запрещена. В режиме nomod модификация полей сегментов ключа запрещена, при этом вставка и удаление записей разрешаются.
Для составного ключа значение атрибута определяется по первому сегменту и дальнейшее изменение атрибута в пределах данного ключа воспринимается как ошибка.
Значение атрибута по умолчанию mod.
<атрибут-уникальности> = duplicates | unique
duplicates (d) - уникальность ключа не контролируется, т.е. ключ может иметь одинаковые значения для разных записей таблицы.
unique (un) - контролируется уникальность ключа.
Для составного ключа значение атрибута определяется по первому сегменту и дальнейшее изменение в пределах одного ключа воспринимается как ошибка.
Значение по умолчанию duplicates.
<атрибут-регистров> = upcase | noupcase
upcase (up) - игнорировать регистр букв.
noupcase (nup) - различать регистр букв.
Атрибут определяется для каждого сегмента ключа.
Значение по умолчанию upcase.
<атрибут-сортировки> = asc | desc
asc - сортировка записей в порядке возрастания значения поля для данного сегмента индекса.
desc - обратный порядок сортировки.
Атрибут сортировки определяется для каждого сегмента.
Для составного ключа сортировка записей производится по полю и атрибуту первого сегмента ключа. Если поле первого сегмента не является уникальным, то есть существуют записи, имеющие одинаковые значения в поле первого сегмента, то сортировка подобных записей производится по полю и атрибуту второго сегмента ключа и т.д. Таким образом, для сортировки записей имеет значение порядок перечисления сегментов индекса. Значение по умолчанию asc.
Например, пусть имеется таблица, в которой есть шесть записей. Предположим, один из индексов таблицы описан следующим образом:
a (seg, asc), b (asc)
Если открыть таблицу по этому индексу, то записи будут отсортированы в таком порядке:
1 |
1 |
1 |
2 |
2 |
1 |
2 |
2 |
3 |
1 |
3 |
2 |
Предположим, индекс описан иначе:
a (seg, asc), b (desc)
Записи будут отсортированы в следующем порядке:
1 |
2 |
1 |
1 |
2 |
2 |
2 |
1 |
3 |
2 |
3 |
1 |
<атрибут-вхождения-нулевой-записи> = null
null (n) - если для данной записи все сегменты индекса имеют нулевые значения, запись не индексируется. В таблицу эта запись попадает на общих основаниях. Таким образом при просмотре таблицы по данному индексу эта запись не будет видна. В то же время она может быть видна при просмотре таблицы по другому индексу.
Для составного ключа значение атрибута определяется по первому сегменту и дальнейшее изменение в пределах одного ключа воспринимается как ошибка.
Значение по умолчанию null.
<длина-сегмента> = length = <целое-число>
Атрибут length (l) устанавливает значимую длину сегмента ключа, равную целому числу без знака.
Длина сегмента задается для каждого сегмента индекса отдельно. Начало сегмента совпадает с началом поля, если не задано смещение сегмента (см. ниже в данном разделе).
Используется для полей типа string и char.
По умолчанию длина сегмента приравнивается к длине поля.
<смещение-сегмента> = offset = <целое-число>
Атрибут offset задает позицию, начиная с которой значение поля воспринимается как значение сегмента.
Смещение сегмента задается для каждого сегмента индекса отдельно.
По умолчанию смещение сегмента считается равным нулю.
Используется для полей типа string и char.
Если смещение сегмента больше 1, то тип сегмента ключа устанавливается char, иначе тип сегмента ключа соответствует типу поля сегмента.
<атрибут-счетчика-записей> = autoinc
Атрибут autoinc (a) устанавливается на поля, которые Вы хотите использовать для подсчета количества вставленных записей. СУБД Атлантис поддерживает автоматическое увеличение значения соответствующего поля на единицу в ходе операции insert.
Таблица может иметь только одно поле с атрибутом autoinc.
Атрибут autoinc используется только для уникальных несегментированных индексов на поля типа longInt.
Для полей с атрибутом autoinc автоматически устанавливается атрибут уникальности unique.
<атрибут-суррогатного-ключа> = surrogate
surrogate (s) - атрибут используется только для уникальных несегментированных индексов на поля типа comp.
СУБД Атлантис поддерживает автоматическое увеличение значения суррогатного поля на единицу в ходе операции insert. Суррогатное поле (ключ) постоянно возрастает в диапазоне текущего офиса, который задан в таблице журнальной конфигурации X$JournalConfig.
Для суррогатного ключа автоматически ставится атрибут уникальности unique.
Недопустимо менять в прикладном коде значения полей, имеющих атрибут surrogate. В противном случае возможны нежелательные эффекты. В частности, такие изменения не журналируются и не участвуют в репликации баз данных (в межофисном обмене). Возможны и другие, непредсказуемые последствия.
<атрибут-журналирования> = journal
Атрибут journal (j) указывает на поле, значение которого будет заноситься в таблицу журнала изменений X$Journal в качестве идентификатора измененной /добавленной /удаленной записи. Идентификатор записи NRec.
Атрибут journal используется только для уникальных несегментированных индексов на поля целочисленного типа.
Для полей с атрибутом journal автоматически устанавливается атрибут уникальности unique.
Таблица может иметь только одно поле с атрибутом journal. Если атрибут не задан, таблица не может журналироваться.
Рекомендуется использовать атрибут journal для полей, имеющих атрибут surrogate (см. выше в данном разделе).