Oc-windows.ru

IT Новости из мира ПК
9 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Не обнаружен уникальный индекс access

Создание и использование индексов

С целью ускорения поиска и сортировки данных в любой СУБД используются индексы. Индекс является средством, которое обеспечивает быстрый доступ киданным в таблице на основе значений одного или нескольких столбцов. Индекс представляет собой упорядоченный список значений и ссылок на те записи, в которых хранятся эти значения. Чтобы найти нужные записи, СУБД сначала ищет требуемое значение в индексе, а затем по ссылкам быстро отбирает соответствующие записи. Индексы бывают двух типов: простые и составные. Простые индексы представляют собой индексы, созданные по одному столбцу. Индекс, построенный по нескольким столбцам, называется составным. Примером составного индекса может быть индекс, построенный по столбцам «Фамилия» и «Имя».

Однако применение индексов приносит не только преимущества, но и недостатки. Главным среди них является тот, что при добавлении и удалении записей или при обновлении значений в индексном столбце требуется обновлять индекс, что при большом количестве индексов в таблице может замедлять работу. Поэтому индексы обычно рекомендуется создавать только для тех столбцов таблицы, по которым наиболее часто выполняется поиск записей. Во многих СУБД (например, FoxPro) индексы хранятся в отдельных файлах и являются предметом заботы разработчиков, т. к. при нарушении индекса поиск данных выполняется некорректно. В Microsoft Access индексы хранятся в том же файле базы данных, что и таблицы и другие объекты Access. Индексировать можно любые поля, кроме МЕМО-полей, полей типа Гиперссылка и объектов OLE.

Чтобы создать простой индекс, необходимо:

  1. Открыть таблицу в режиме Конструктора.
  2. Выбрать поле, для которого требуется создать индекс.
  3. Открыть вкладку Общие (General) и выбрать для свойства Индексированное поле (Indexed) значение Да (Допускаются совпадения) (Yes (Duplicates OK)) или Да (Совпадения не допускаются) (Yes (No duplicates)) (рис. 2.24).

Ключевое поле таблицы автоматически индексируется и свойству Индексированное поле (Indexed) присваивается значение Да (Совпадения не допускаются) (Yes (No duplicates)).

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

  1. Открыть таблицу в режиме Конструктора.
  2. На панели инструментов Конструктор таблиц (Table Design) нажать кнопку Индексы (Indexes.)
  3. В первой пустой строке (рис. 2.25) поля Индекс (Index Name) ввести имя индекса.

По умолчанию устанавливается порядок сортировки По возрастанию (Ascending). Для сортировки данных полей по убыванию в поле Порядок сортировки (Sort Order) в окне индексов укажите значение По убыванию (Descending).

Диалоговое окно Индексы (Indexes) используется также для просмотра, изменения и удаления существующих индексов. Изменить можно:

  • название индекса в поле Индекс (Index Name);
  • поле таблицы, соответствующее данному индексу, выбрав новое поле из списка в поле Имя поля (Field Name);
  • порядок сортировки в поле Порядок сортировки (Sort Order); П свойства данного индекса в нижней части окна (рис. 2.26):
    • Ключевое поле (Primary) определяет, является ли индексированное поле ключевым;
    • Уникальный индекс (Unique) определяет, должно ли быть каждое значение в этом поле уникальным;
    • Пропуск пустых полей (Ignore Nulls) определяет, включаются или не включаются в индекс записи с пустым (Null) значением данного поля.

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

Не обнаружен уникальный индекс

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

Введение в суть БД:

17.05.2013, 23:32

Не обнаружен уникальный индекс
Как можно связать дату с датой, Н рейса с Н рейса?

Не обнаружен уникальный индекс
Создаю базу данных ( работа по учебе ). Создано и заполнено 8 таблиц. Но на шаге создания схемы.

Не обнаружен уникальный индекс
CREATE TABLE TypeSpis( + Integer PRIMARY KEY, + .

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

17.05.2013, 23:39 [ТС]218.05.2013, 02:403

1. Составные ключи однозначно фтопку: уникальным ключом должно быть поле счётчика, связанное с ним — числовое длинное целое (по крайней мере здесь в большинстве случаев принято так).

Каскадное удаление заодно туда же. При современных мощностях, ресурсах (очевидно опережающих спрос на такой объём, скорость и т.д.), предоставляемых производителями даже средних (и даже «слабых») машин, удалять что-либо неразумно: сейчас каждый палаточник-чебуречник пишет всё и имеет возможность хранить всё мультимедиа, взятое посредством его «ведётся наблюдение».

Добавлено через 5 минут
2. Связи между таблицами делаем только в Схеме данных, никаких подстановок в таблицах (это баг Микрософта, подобный автозапуску флэшек): однозначно потом будете переделывать эту околесицу (поиск по Форуму: Поля подстановок в таблицах)

Добавлено через 30 минут
3. Развитие Аксесс остановилось с выходом версии 2003; после него — почти только так наз «плюшки», больше мешающие нормальной работе, чем ей способствующие.

«Остановилось» — это не в негативном смысле, но, как я уже упомянул, по объективным (реальным) причинам: потому что фактически уже тогда был полностью решён вопрос потребностей в организации необходимого функционала по учётурасчёту деятельности как однопользовательских (индивидуальных, «под себя») систем, так и многопользовательских уровня малого (и даже среднего) бизнеса.

Магистральное направление сейчас — это взаимодействие пользователей не посредством локального, но вэб-интерфейса. Но на практике он, во-первых, пока мало приживается, во-вторых, очень мало спецов, умеющих его качественно делать, в третьих, ещё меньше заказчиков, которые в состоянии объяснить его необходимость и дать взвешенное технич задание на его исполнение. И это длится уже, наверное, год третий, и пока мало сдвигается с места. Реально.

Ещё раз: практически все фундаментальные практические решения (и не только в Аксе: для примера, Вай Фай и т.д.) внедрены ещё в самом начале нулевых и не имеют пока революционного продолжения, за исключением всяких мультимедийных плюшек (например, цифровое, интернет-тв и проч безтолковщина. )

Уникальный индекс по полям, которые могут иметь null’евые значение¶

Частенько разработчики и администраторы PostgreSQL сталкиваются с вроде бы ошибкой PostgreSQL — на таблицу создан уникальный индекс, который «не работает». То есть в таблице есть строки, которые должны содержать некоторый набор полей, значение которых должно быть уникальным для всей таблице, но это условие не выполняется. Более подробный анализ дублей показывает, что все проблемные строки содержат хотя бы одно null’евое значение в одном из полей. А null != null (см. статью Сравнение с NULL). Отсюда и все «проблемы».

Пример описанной проблемы

Есть таблица test_func_index и уникальный индекс по полям name, cdate

Проверим работу уникального индекса.

Инициализация таблицы начальными значениями

Проверяю работу уникального индекса с ненулевыми значениями. Индекс работает

Проверяю работу уникального индекса с NULL’евыми значениями. Индекс не работает

Проблема уникальности присутствует.

На данный момент есть три самых популярных решений описанной проблемы:

  • Применение функционального индекса
  • Использование частичного индекса
  • Применение суррогатного уникального индекса

Функциональный индекс¶

Каждое поле уникального индекса оборачивается функцией COALESCE, в итоге NULL’евые значения полей в индексе заменяются специальными предопределенными значениями.

В данном примере нулевая строка заменяется пустой строкой, а нулевая дата — бесконечной датой

Проверим работу индекса.

Проверка работы уникального индекса для нулевых значений. Индекс работает.

Работа индекса в обычных запросах. Индекс не работает.

Работа индекса при использовании функции COALESCE, но с другими константами. Не работает

Работа индекса при использовании функции COALESCE и теми же параметрами. Работает.

Плюсы

  • Уникальность достигается без дополнительных ухищрений в момент внесения данных в таблицу
  • Индекс работает не только как уникальный, но и годен для фильтрации данных

Минусы

  • Специальные значения, которыми заменяются NULL’евые, должны быть вне допустимого диапазона ненулевых значений
  • Фильтрация работает только при использовании COALESCE с константами, которые были определены в индексе

Частичный индекс¶

Для каждого NULL’евого поля и/или комбинации NULL’евых полей создаётся свой индекс. Это необходимо, чтобы индексы не перекрывали друг друга (меньше нагрузки при вставке данных и меньше места для хранения индекс)

Индексы не перекрываются, но при этом поддерживают уникальность по полям name и cdate

Плюсы

  • Никаких искусственно созданных ограничений при работе со значениями полей.
  • Фильтрация работает без ограничений
  • Никакого оверхеда при хранении

Минусы

  • Сложность создания индексов. Количество индексов должно быть количество_полей в степени двойки (для трех полей — 8, для 4 — 16)

«Суррогатный» индекс¶

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

Функция склеивания полей

Проверка работы индекса

Индекс работает как и ожидалось.

Плюсы

Минусы

  • Требуется создавать склеивающую поля функцию
  • Индекс работает только на уникальность, на фильтрацию — не работает.

Резюме¶

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

Использование функционального индекса (первый способ) не всегда возможен и очень плох в поддержке (необходимо выделять специальные значения для NULL’ов и фильтрация работает только при соблюдении определенных условий).

Третий способ с суррогатным индексом можно применять только, если необходимо только поддержка уникальности, так как большего он предоставить не может.

Хорошим компромиссом может стать синергия обычного уникального индекса и суррогатного индекса для нулевых полей. Для вышеописанной таблицы это будет выглядеть так.

Обычный уникальный индекс, обеспечивающий уникальность для ненулевых полей и полноценную фильтрацию

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

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

Читать еще:  Ключ office 2020
Ссылка на основную публикацию
Adblock
detector