Генерация первичных ключей для идентификации объектов словаря

SQLite

Движок этой БД автоматически генерирует уникальные значения при вставке новой записи в таблицу для столбца, имеющего атрибут PRIMARY KEY в случае, если в операторе INSERT пропустить данный столбец.

Чтобы получить значение, сгенерированное для первичного ключа, надо после выполнения оператора INSERT вызвать функцию API sqlite3_last_insert_rowid. Она вернет 64-битное значение - сгенерированный ключ.

Особенность данного механизма генерации - он начинает значения первичного ключа с 1. Таким образом, если нам по каким-то причинам важно получить для записи 0 в качестве первичного ключа, необходимо явно задать его в операторе INSERT, подавив автогенерацию.

MySQL

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

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

Во-первых, можно выполнить запрос SELECT LAST_INSERT_ID(). Необычный синтаксис оператора SELECT в данном случае является особенностью этой СУБД. Такой способ применяется в случае, когда нет возможности вызвать функции клиента MySQL, например при работе через ODBC, и в классе MySQL_DataAccessLayer, который обеспечивает доступ к словарю в рамках ORM библиотеки.

Более быстрый способ применим в случае работы с native API. Функция mysql_insert_id возвращает значение первичного ключа, созданное в последнем выполненном операторе INSERT. Этот вызов используют классы, используемые C++ кодом словаря.

Автоматическая генерация первичного ключа в этой СУБД имеет особенность, связанную с интерпретацией значения 0 по умолчанию. Дело в том, что без специальной настройки, вставка новой записи с явно указанным первичным ключом, равным 0, интерпретируется движком БД как вставка с NULL в поле ключа. Поэтому вставить в таблицу запись с 0 в поле первичного ключа невозможно - сервер сгенерирует для этой записи первичный ключ, например 1. И если мы выполняем скрипт загрузки SQL словаря, в котором значения первичного ключа уже заданы явно, то вполне возможно получить ошибку из-за нарушения уникальности первичного ключа на вставе следующей записи с первичным ключем=1. В документации по MySQL задание 0 для первичного ключа названо плохой практикой. Но если нулевое значение первичного ключа все-таки необходимо, то следует перед загрузкой таблиц выполнить команду

SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO'

Она запретит на время загрузки SQL в БД считать 0 равным NULL при вставке значений первичного ключа. Именно такие команды можно увидеть в скрипте загрузки грамматического словаря.

MS SQL

Данная СУБД также имеет возможность автоматической генерации первичных ключей. Для этого необходимо указать в операторе CREATE TABLE для соответствующего столбца атрибут IDENTITY.

Чтобы получить значение первичного ключа, сгенерированное в последнем выполненном операторе INSERT, необходимо выполнить запрос SELECT @@identity. Это напоминает соответствующий функционал в MySQL. Класс MSSQL_DataAccessLayer в ORM библиотеке использует именно такой способ.

Важная особенность механизма генерации первичных ключей, которую следует учитывать при загрузке словаря в БД - необходимо отключать генерацию в операторе BULK INSERT. Для этого перед BULK INSERT надо выполнить команду SET IDENTITY_INSERT ... ON, а после вставки данных - команду SET IDENTITY_INSERT ... OFF. Это позволит нормально вставлять значения в поле первичного ключа в ходе начальной загрузки словаря в базу данных.

Другая возможность генерации уникальных первичных ключей, имеющаяся в MS SQL, основана на типе данных uniqueidentifier и функции NEWID(). Тип uniqueidentifier хранит 16-байтовые значения GUID. Функция NEWID() возвращает новые уникальные значения, причем для нее декларируется глобальная уникальность значений, так как они основаны на использовании уникального (в теории) MAC адреса сетевой карты. В рамках грамматического словаря данный механизм не используется, так как работа с GUID'ами намного тяжелее, чем работа с 32-битными идентификаторами identity, как для сервера при операциях с индексами, так и в клиентском коде из-за большого размера данных.

FireBird

Данная СУБД не имеет механизма автоматической генерации первичных ключей, реализованных в SQLite, MySQL, MS SQL. Вместо этого необходимо использовать генераторы - специальные объекты в схеме, которые при каждом обращении к себе возвращают уникальное значение. Для каждой таблицы с помощью команды CREATE SEQUENCE создается свой генератор. Для получения очередного значение для первичного ключа выполняется запрос

select gen_id( имя_генератора,1) from rdb$database

В этом запросе фигурирует специальная служебная таблица с именем rdb$database, которая всегда имеет ровно 1 запись.

В функции gen_id можно задавать второй аргумент как 0 или -1, таким образом запрашивая текущее значение генератора или выполняя его декремент, но при работе с грамматическим словарем такие сценарии не используются.

В некоторых случаях может быть удобнее вместо явного обращения к генератору отдельным запросом перед командой INSERT создать триггер на вставку, который сработает перед добавлением кортежа в таблицу и в случае, если поле первичного ключа содержит NULL, обратиться к соответствующему генератору. Однако данный механизм не используется ни в скрипте создания словаря, ни при работе ORM.

Oracle

Для генерации уникальных первичных ключей в СУБД корпорации Oracle используется штатный механизм последовательностей (sequences), в целом аналогичный FireBird. Перед вставкой нового кортежа в таблицу мы генерируем значение первичного ключа с помощью запроса

SELECT имя_последовательности.NEXTVAL FROM DUAL

В данном запросе используется специальная таблица DUAL, которая всегда содержит единственную строку, так что результирующее множество будет содержать единственную запись. Класс Oracle_DataAccessLayer в ORM библиотеке словаря реализует именно такой подход к получению первичных ключей.

Дополнительные материалы

Дистрибутив SQL словаря

Словарь в реляционной базе данных

Загрузка SQL словаря

Символические константы для первичных ключей

ORM библиотека для доступа к словарю в БД

  © Elijah Koziev 2010
прикладные проекты на основе грамматического словаря API грамматической машины компоненты для доступа к грамматическому словарю условия получения SDK токенизатор и сегментатор морфологический анализ и синтез лемматизатор база N-грамм синтаксический анализатор словоформы морфология и синтаксис русского языка падеж число род совершенный и несовершенный вид экспорт в SQL формат экспорт в XML формат скрипт SQL словаря структура SQL словаря структура XML словаря компоненты для доступа к грамматическому словарю ORM Persistent Dictionary Library лемматизация стемминг примеры использования грамматического словаря склонение существительных в русском языке склонение русских прилагательных спряжение глаголов в русском языке поиск текста с учетом морфологии OCR подсистема расширенные регулярные выражения генератор текста генератор случайного текста и имитатор рандомизатор синонимизатор перефразировщик Статистика буквенных паттернов

Грамматический словарь русского языка



Грамматический словарь
склонение и спряжение глаголов, существительных, прилагательных

В состав входит русский и английский словарь.

платформа:  Windows 2000 ... Windows 7
требования: 512 Mb свободной памяти, 300 Мб на диске
размер:         34 Мб

  скачать грамматический словарь купить грамматический словарь SDK грамматического словаря
грамматический словарь русского языка



SDK Грамматического словаря



SDK Грамматического Словаря
склонение и спряжение глаголов, существительных, прилагательных

В состав входит русский и английский словарь.

платформа:  Windows 2000 ... Windows 7
размер:         13 Мб

SQL словарь (демо):
sqlite mysql oracle firebird mssql

скачать демо-версию SDK купить SDK API грамматического словаря



Поисковая система



Integra
настольная и сетевая поисковая система 

платформа:  Windows XP ... Windows 7
требования: 512 Mb свободной памяти
размер:         21 Мб

Дополнительные компоненты:
MySQL поисковый сервер 13.5 Мб
Integra.Premium MySQL 3.9 Мб

скачать поисковую систему SDK поисковой системыописание поисковой системы



SDK Поисковой системы



SDK Поискового движка
API для настольной и сетевой поисковая система 

платформа:  Windows XP ... Windows 7
размер:         17 Мб

Дополнительные компоненты:

MySQL поисковый сервер 13.5 Мб
Integra.Premium MySQL 3.9 Мб

скачать SDK SDK поисковой системы



Экранный переводчик



Translator
экранный переводчик

платформа:  Windows XP ... Windows 7
требования: 256 Mb свободной памяти
размер:         4.4 Мб

Дополнительные компоненты:
расширенный англо-русский словарь 6.4 Мб


скачать экранный переводчикописание экранного переводчика



изменено 16-Aug-11