自動インクリメント フィールド(FireDAC)

提供: RAD Studio
移動先: 案内検索

データの編集(FireDAC) への移動

概要

FireDAC では、自動インクリメント列を持つ新しいレコードの挿入と、その列の新しい値の取得が可能です。これは即時更新のほか、キャッシュ更新の場合にも機能します。DBMS によって、自動インクリメント フィールドは、以下のように、特殊な列データ型 IDENTITY(または類似のデータ型)を使用するか、ジェネレータ(またはシーケンス)とテーブル トリガを使用して実装されている場合があります。

DBMS 自動インクリメント列の実装 認識
Advantage Database データ型 AUTOINC 自動インクリメント データ型として自動認識
Firebird
  • ジェネレータと BEFORE INSERT トリガ
  • Firebird 3.0: GENERATED BY DEFAULT AS IDENTITY
自動認識および手動指定。以下を参照。
InterBase ジェネレータと BEFORE INSERT トリガ 自動認識および手動指定。以下を参照。
IBM DB2 データ型 GENERATED AS IDENTITY 自動インクリメント データ型として自動認識
Informix データ型 SERIAL 自動インクリメント データ型として自動認識
Microsoft Access データ型 COUNTER 自動インクリメント データ型として自動認識
Microsoft SQL Server データ型 IDENTITY 自動インクリメント データ型として自動認識
MySQL データ型 AUTO_INCREMENT 自動インクリメント データ型として自動認識
Oracle
  • シーケンスと BEFORE INSERT FOR EACH ROW トリガ
  • Oracle 12c 以降: GENERATED AS IDENTITY データ型
  • 手動での指定。以下を参照。
  • 自動インクリメント データ型として自動認識
PostgreSQL データ型 SERIAL 自動インクリメント データ型として自動認識
SQL Anywhere データ型 IDENTITY 自動インクリメント データ型として自動認識
SQLite データ型 INTEGER PRIMARY KEY AUTOINCREMENT 自動インクリメント データ型として自動認識
Sybase Adaptive Server Enterprise データ型 IDENTITY 自動インクリメント データ型として自動認識
Teradata Database データ型 GENERATED AS IDENTITY ExtendedMetadataTrue の場合、自動インクリメント データ型として自動認識

自動認識

FireDAC では、自動インクリメント データ型の列を自動的に認識し、それを dtIntXxxAttrs = [caAutoInc, caReadOnly, caAllowNull])と定義します。その結果、TField が以下のようにセットアップされます。

FireDAC では、以下の場合に、Firebird の自動インクリメント列の限られた集合を自動的に認識し、それらを dtIntXxxAttrs = [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 のプロパティを使用すると、クライアント側での自動インクリメントを以下のように調整できます。

クライアント シーケンスからの入力

DBMS でシーケンスまたはジェネレータ(ここでは両者は同義です)がサポートされている場合、FireDAC では、クライアント上のシーケンスから自動インクリメント列に値を入力することができます。これは、クライアント側での自動インクリメントの代わりとなるものです。

自動インクリメント列では TField.ProviderFlagspfInUpdate が含まれている必要があります。また、以下の UpdateOptions.FetchGeneratorsPoint 値のどちらか一方も必要です。

  • gpImmediate -- TDataSet.Insert/Append メソッドでジェネレータから後続の値が移動されます。しかも、この値は TDataSet.OnNewRecord イベント ハンドラで既にアクセス可能になっています。TDataSet.Cancel メソッドが呼び出されると、この値は失われます。
  • gpDeferred -- TDataSet.Post メソッドでジェネレータから後続の値が移動されます。

UpdateOptions.GeneratorName または TFDAutoIncField.GeneratorName をジェネレータ名に設定します。この名前が次のシーケンス値を取得するのに使用されます。

汎用セットアップ

自動インクリメント列の以下のセットアップは、ネイティブな自動インクリメント列のサポートやシーケンスとトリガの使用も含めて、任意の DBMS で機能します。

  • UpdateOptions.FetchGeneratorsPoint = gpNone の場合、クライアント シーケンスからの入力は無効です。
  • pfInUpdateTField.ProviderFlags の値である場合、この列は INSERT/UPDATE 句から取り除かれます。
  • FetchOptions.ItemsfiMeta に設定されている場合、この列は自動インクリメント列であると認識されます。

Oracle、Firebird、Interbase の場合は、自動インクリメント列の手動指定が必要です。ネイティブな自動インクリメント データ型をサポートしているデータベースの場合は、それ以上のセットアップは不要です。しかし、指定そのものはどちらの場合でもうまくいきます。

マスタ/詳細関係の処理

マスタ データセットと詳細データセットが自動インクリメントのマスタ列でリンクされていて、キャッシュ更新が有効になっている場合は、マスタ データセットから詳細データセットへの変更の伝播が可能な一元キャッシュ更新モードを使用することを検討します。

関連項目

サンプル