一意識別フィールド(FireDAC)

提供: Appmethod Topics
移動先: 案内検索

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


概要

各データセット レコードを一意に識別する列の集合を一意識別列と呼びます。 データセットが単一テーブルの SELECT で得られる場合、一意識別列は FROM テーブルの主キーです。 多くの場合、自動インクリメント フィールドはテーブルの主キーです。

用途

一意識別フィールドは、以下を目的とした WHERE 句の作成に使用されます。

  • 更新のポスト(Edit/Post)およびデータセットからの削除(Delete): UpdateOptions.UpdateModeupWhereKeyOnly または upWhereChanged の場合
  • 現在のデータセット レコードの更新(RefreshRecord
  • 遅延された BLOB 値の取得(FetchBlobs)およびネストしたデータセットの取得(FetchDetails

注意事項

fiMetaFetchOptions.Items に含まれている場合、TFDQueryTFDTableTFDMemTableTFDCommand は、SELECT ... FROM ... 文の主要テーブル(最初のテーブル)の一意識別列(mkPrimaryKeyFields)を自動的に取得します。メモ:

  • mkPrimaryKeyFields のクエリは時間がかかる可能性があります。
  • FireDAC で一意識別列を正しく決定できない場合は、アプリケーション側でそれらを明示的に指定しなければならない可能性があります。

列を明示的に指定する場合は、FetchOptions.Items から fiMeta を除き、以下のいずれかを使用します。

アプリケーションで永続フィールドが作成される場合は、最初に 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

関連項目