Эта статья об автоинкрементных полях в FireDAC. Она основана на официальной документации
FireDAC поддерживает вставку новой записи через автоинкрементную колонку и получение нового значения этой колонки. Этот механизм помогает немедленному обновлению, так же как для cached updates. В зависимости от DBMS автоинкрементные поля могут использоваться через специальную идентификационную колонку или через генератор и табличный триггер. Далее, в документации приводится такая таблица.
Автоматическое распознавание
FireDAC автоматически распознает колонку с автоинкрементом и определяет ее в dtIntXxx [caAutoInc, caReadOnly, caAllowNull]. Это помогает настройке TField
- TField.DataType = ftAutoInc (TFDAutoIncField) when dtInt32 or dtUInt32; в ином случае один из типов данных ftXxxx;
- TField.Required = False;
- TField.ReadOnly = True;
- TField.ProviderFlags = [pfInWhere], or [pfInWhere, pfInKey] когда колонка часть первичного ключа
FireDAC автоматически распознает ограниченные множества автоинкрементных колонок FireBird и устанавливает их в dtIntXxx
, [caAutoInc, caAllowNull] когда
- включен режим extended metadata ;
- у таблицы есть BEFORE INSERT trigger;
- триггер зависит от отдельной колонки и отдельного генератора. Эта колонка распознается как автоинкрементная.
Автоинкремент на клиенте
По умолчанию FireDAC использует автоинкрементные поля на клиенте. После вызова методов Insert / Append, автоинкреметная колонка получит значение -1. С каждым следующим вызовом, значение получит ещё одно значение -1.
Когда UpdateOptions.RefreshMode <> rmManual, после “постинга” новой записи автоинкрементная колонка получит положительное значение.
Свойства TFDAutoIncField позволяют настроить автоинкремент на клиенте
- ClientAutoIncrement включить или выключить;
- AutoIncrementSeed чтобы уточнить начальное значение;
- AutoIncrementStep чтобы уточнить шаг
Универсальная настройка
Следующая настройка автоинкрементна будет работать с любой DBMS
-Когда UpdateOptions.FetchGeneratorsPoint = gpNone
-Когда pfInUpdate это значение TField.ProviderFlags, автоинкремент исключается из INSERT / UPDATE выражений
-Когда FetchOptions.Items поставлены в fiMeta, колонка распознается как авто-инкрементная
Для Oracle,Firebird, IB необходимо вручную настраивать автоинкрементные колонки. Для DBMS, поддерживающих автоинкрементные поля никаких дополнительных действий не требуется.