自動インクリメント フィールド(FireDAC)
データの編集(FireDAC) への移動
目次
概要
FireDAC では、自動インクリメント列を持つ新しいレコードの挿入と、その列の新しい値の取得が可能です。これは即時更新のほか、キャッシュ更新の場合にも機能します。DBMS によって、自動インクリメント フィールドは、以下のように、特殊な列データ型 IDENTITY(または類似のデータ型)を使用するか、ジェネレータ(またはシーケンス)とテーブル トリガを使用して実装されている場合があります。
DBMS | 自動インクリメント列の実装 | 認識 |
---|---|---|
Advantage Database | データ型 AUTOINC | 自動インクリメント データ型として自動認識 |
Firebird |
|
自動認識および手動指定。以下を参照。 |
InterBase | ジェネレータと BEFORE INSERT トリガ | 自動認識および手動指定。以下を参照。 |
IBM DB2 | データ型 GENERATED AS IDENTITY | 自動インクリメント データ型として自動認識 |
Informix | データ型 SERIAL | 自動インクリメント データ型として自動認識 |
Microsoft Access | データ型 COUNTER | 自動インクリメント データ型として自動認識 |
Microsoft SQL Server | データ型 IDENTITY | 自動インクリメント データ型として自動認識 |
MySQL | データ型 AUTO_INCREMENT | 自動インクリメント データ型として自動認識 |
Oracle |
|
|
PostgreSQL | データ型 SERIAL | 自動インクリメント データ型として自動認識 |
SQL Anywhere | データ型 IDENTITY | 自動インクリメント データ型として自動認識 |
SQLite | データ型 INTEGER PRIMARY KEY AUTOINCREMENT | 自動インクリメント データ型として自動認識 |
Sybase Adaptive Server Enterprise | データ型 IDENTITY | 自動インクリメント データ型として自動認識 |
Teradata Database | データ型 GENERATED AS IDENTITY | ExtendedMetadata が True の場合、自動インクリメント データ型として自動認識
|
自動認識
FireDAC では、自動インクリメント データ型の列を自動的に認識し、それを dtIntXxx
(Attrs = [caAutoInc, caReadOnly, caAllowNull]
)と定義します。その結果、TField が以下のようにセットアップされます。
- TField.DataType = dtInt32 または dtUInt32 の場合 ftAutoInc(TFDAutoIncField)、そうでない場合は数値データ型 ftXxxx のいずれか 1 つ
- TField.Required = False
- TField.ReadOnly = True
- TField.ProviderFlags = [pfInWhere] または、列が主キーの構成要素の場合は [pfInWhere, pfInKey]
FireDAC では、以下の場合に、Firebird の自動インクリメント列の限られた集合を自動的に認識し、それらを dtIntXxx
(Attrs = [caAutoInc, caAllowNull]
)に設定します。
- 拡張メタデータが有効になっている。
- テーブルに BEFORE INSERT トリガがある。
- このトリガが単一の列と単一のジェネレータに基づいている。この列が自動インクリメント列として認識されます。
手動指定
Oracle の場合、Firebird/Interbase の上記以外の場合、他の列の場合は、以下のいずれかの方法を使って、自動インクリメント モードを手動で指定することができます。
- UpdateOptions.AutoIncFields を自動インクリメント列名のリストに設定する。列が dtInt32/dtUInt32 データ型の場合は、TFDAutoIncField フィールドが作成されます。
- 設計時または実行時に TFDAutoIncField フィールドを作成する。この列は ftAutoInc/ftInteger/ftLongWord フィールド型でなければなりません。他のデータ型の場合は、TargetDataType =
dtInt32
へのデータ型マッピングを使用することを検討します。 - TField.AutoGenerateValue を自動インクリメント フィールドに対応する
arAutoInc
に設定する。この方法では、TFDAutoIncField は作成されません。任意のフィールド型で使えますが、ProviderFlags、Required、ReadOnly の設定など、フィールド プロパティの追加セットアップが必要になる場合があります。
これらの方法のどれを使用しても、最終的には TField.AutoGenerateValue = arAutoInc
という結果になります。
クライアント側での自動インクリメント
FireDAC ではデフォルトで、自動インクリメント列のクライアント側での自動インクリメントを使用します。データセットの Insert/Append メソッドの呼び出し後、自動インクリメント列の値は -1 になります。それ以降、メソッド呼び出しのたびに、値は -1 ずつインクリメントされます。これは、クライアントで割り当てられた値と DBMS で割り当てられた値を区別するためです。
UpdateOptions.RefreshMode <> rmManual
の場合は、新しいレコードのポスト後に自動インクリメント列に実際の正の値が設定されます。
TFDAutoIncField のプロパティを使用すると、クライアント側での自動インクリメントを以下のように調整できます。
- ClientAutoIncrement: 自動インクリメントの有効/無効を切り替えます。
- AutoIncrementSeed: 初期値を指定します。
- AutoIncrementStep: 増分を指定します。
クライアント シーケンスからの入力
DBMS でシーケンスまたはジェネレータ(ここでは両者は同義です)がサポートされている場合、FireDAC では、クライアント上のシーケンスから自動インクリメント列に値を入力することができます。これは、クライアント側での自動インクリメントの代わりとなるものです。
自動インクリメント列では TField.ProviderFlags に pfInUpdate
が含まれている必要があります。また、以下の UpdateOptions.FetchGeneratorsPoint 値のどちらか一方も必要です。
gpImmediate
-- TDataSet.Insert/Append メソッドでジェネレータから後続の値が移動されます。しかも、この値は TDataSet.OnNewRecord イベント ハンドラで既にアクセス可能になっています。TDataSet.Cancel メソッドが呼び出されると、この値は失われます。gpDeferred
-- TDataSet.Post メソッドでジェネレータから後続の値が移動されます。
UpdateOptions.GeneratorName または TFDAutoIncField.GeneratorName をジェネレータ名に設定します。この名前が次のシーケンス値を取得するのに使用されます。
汎用セットアップ
自動インクリメント列の以下のセットアップは、ネイティブな自動インクリメント列のサポートやシーケンスとトリガの使用も含めて、任意の DBMS で機能します。
- UpdateOptions.FetchGeneratorsPoint =
gpNone
の場合、クライアント シーケンスからの入力は無効です。 - pfInUpdate が TField.ProviderFlags の値である場合、この列は INSERT/UPDATE 句から取り除かれます。
- FetchOptions.Items が fiMeta に設定されている場合、この列は自動インクリメント列であると認識されます。
Oracle、Firebird、Interbase の場合は、自動インクリメント列の手動指定が必要です。ネイティブな自動インクリメント データ型をサポートしているデータベースの場合は、それ以上のセットアップは不要です。しかし、指定そのものはどちらの場合でもうまくいきます。
マスタ/詳細関係の処理
マスタ データセットと詳細データセットが自動インクリメントのマスタ列でリンクされていて、キャッシュ更新が有効になっている場合は、マスタ データセットから詳細データセットへの変更の伝播が可能な一元キャッシュ更新モードを使用することを検討します。