Delphi.FireDAC. Уникальные идентификационные поля

Эта статья об уникальных идентификационных полях. FireDAC использует уникальные идентификационные поля для эффективного выполнения SQL команд. Статья основана на официальной документации

-Старая версия

-Новая версия

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

Использование

Уникальные идентификационные колонки используются для выражений WHERE

-для отправки обновлений (Edit/Post) и удаления (Delete) из множества, когда UpdateOptions.UpdateMode в состоянии upWhereKeyOnly or upWhereChanged;

-для получения свежих данных множества (RefreshRecord)

-для «селекта» отложенных BLOB значений и вложенных множеств

Принципы работы

TFDQuery, TFDTable, TFDMemTable, и TFDCommand автоматически получают уникальные идентификационные колонки (mkPrimaryKeyFields) для главной (первой) таблицы в выражении SELECT … FROM …, когда fiMeta включено в FetchOptions.Items

-запрос mkPrimaryKeyFields может быть затратен по времени

-приложение может явно определить уникальные идентификационные колонки, когда FireDAC не может определить их корректно

Для явного определения, исключите fiMeta  из FetchOptions.Items  и используйте одну из следующих возможностей

-установите ключевые поля в UpdateOptions.KeyFields разделяя их «;»

-включите pfInKey в соответствующее свойство TField.ProviderFlags

Когда приложение создает «постоянные» (не меняющиеся) поля, тогда первоначально TField.ProviderFlags будут установлены корректно.После этого автоматической установки не происходит, когда меняется структура базы данных. Вы должны проставить флаги ProviderFlags в ручную и настроить column list. Также, если первичный ключ состоит из нескольких полей, тогда все они должны быть включены в «постоянные поля»

Также в документации есть информация об Row Identifying Columns, но я этот раздел рассматривать не стал, так как в MySQL такого нет.