一意識別フィールド(FireDAC)
データの編集(FireDAC) への移動
概要
各データセット レコードを一意に識別する列の集合を一意識別列と呼びます。 データセットが単一テーブルの SELECT で得られる場合、一意識別列は FROM テーブルの主キーです。 多くの場合、自動インクリメント フィールドはテーブルの主キーです。
用途
一意識別フィールドは、以下を目的とした WHERE 句の作成に使用されます。
- 更新のポスト(Edit/Post)およびデータセットからの削除(Delete): UpdateOptions.UpdateMode が
upWhereKeyOnly
またはupWhereChanged
の場合 - 現在のデータセット レコードの更新(RefreshRecord)
- 遅延された BLOB 値の取得(FetchBlobs)およびネストしたデータセットの取得(FetchDetails)
注意事項
fiMeta が FetchOptions.Items に含まれている場合、TFDQuery、TFDTable、TFDMemTable、TFDCommand は、SELECT ... FROM ... 文の主要テーブル(最初のテーブル)の一意識別列(mkPrimaryKeyFields)を自動的に取得します。メモ:
- mkPrimaryKeyFields のクエリは時間がかかる可能性があります。
- FireDAC で一意識別列を正しく決定できない場合は、アプリケーション側でそれらを明示的に指定しなければならない可能性があります。
列を明示的に指定する場合は、FetchOptions.Items から fiMeta を除き、以下のいずれかを使用します。
- UpdateOptions.KeyFields を列名のセミコロン(';')区切りリストに設定します。
- pfInKey を対応する TField.ProviderFlags プロパティに含めます。
アプリケーションで永続フィールドが作成される場合は、最初に TField.ProviderFlags が正しく設定されます。 その後は、DB の構造またはクエリが変更されても、フィールドの自動セットアップは行われません。 ProviderFlags を手動で更新して、列リストを調整しなければなりません。 また、主キーが複数のフィールドから成る場合は、それらをすべて永続フィールドに含める必要があります。
行識別列
あるいは、行識別列を SELECT リストに含めることもできます。 FireDAC では、そのような列が見つかった場合、mkPrimaryKeyFields メタデータは取得されず、その列が使用されます。 サポートされている DBMS は次のとおりです。
DBMS | 行識別列 |
---|---|
Firebird | DB_KEY |
Informix | RowId |
Interbase | DB_KEY / RDB$DB_KEY |
Oracle | RowId |
PostgreSQL | OID。 テーブルは OID で作成される必要があります。 |
SQLite | RowId |
Oracle の場合の例を以下に示します。
SELECT T.*, ROWID FROM Orders T