Champs auto-incrémentés (FireDAC)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Modification des données (FireDAC)

Informations générales

FireDAC autorise l'insertion d'un nouvel enregistrement avec une colonne auto-incrémentée et l'obtention d'une nouvelle valeur pour cette colonne. Cela fonctionne pour les mises à jour immédiates, ainsi que pour les mises à jour en cache. En fonction du SGBD, les champs auto-incrémentés peuvent être implémentés en utilisant un type de données de colonne IDENTITY (ou similaire) spécial, ou en utilisant un générateur (ou une séquence) et un déclencheur de table :

SGBD Implémentation de colonne auto-incrémentée Reconnaissance
Advantage Database Type de données AUTOINC Automatique en tant que type de données auto-incrémenté.
Firebird
  • Générateur et déclencheur BEFORE INSERT
  • Firebird 3.0 : GENERATED BY DEFAULT AS IDENTITY
Automatique et spécification manuelle. Voir ci-dessous.
InterBase Générateur et déclencheur BEFORE INSERT Automatique et spécification manuelle. Voir ci-dessous.
IBM DB2 Type de données GENERATED AS IDENTITY Automatique en tant que type de données auto-incrémenté.
Informix Type de données SERIAL Automatique en tant que type de données auto-incrémenté.
MS Access Type de données COUNTER Automatique en tant que type de données auto-incrémenté.
MS SQL Server Type de données IDENTITY Automatique en tant que type de données auto-incrémenté.
MySQL Type de données AUTO_INCREMENT Automatique en tant que type de données auto-incrémenté.
Oracle
  • Séquence et déclencheur BEFORE INSERT FOR EACH ROW
  • Pour Oracle 12c et supérieurs : Type de données GENERATED AS IDENTITY
  • Spécification manuelle. Voir ci-dessous.
  • Automatique en tant que type de données auto-incrémenté.
PostgreSQL Type de données SERIAL Automatique en tant que type de données auto-incrémenté.
SQL Anywhere Type de données IDENTITY Automatique en tant que type de données auto-incrémenté.
SQLite Type de données INTEGER PRIMARY KEY AUTOINCREMENT Automatique en tant que type de données auto-incrémenté.
Sybase Adaptive Server Enterprise Type de données IDENTITY Automatique en tant que type de données auto-incrémenté.
Base de données Teradata Type de données GENERATED AS IDENTITY Automatique en tant que type de données auto-incrémenté lorsque ExtendedMetadata vaut True.

Reconnaissance automatique

FireDAC reconnaît automatiquement une colonne au type de données auto-incrémenté et la définit sur dtIntXxx, [caAutoInc, caReadOnly, caAllowNull]. Cela détermine la configuration de TField :

FireDAC reconnaît automatiquement les jeux limités de colonnes auto-incrémentées Firebird et les définit sur dtIntXxx, [caAutoInc, caAllowNull] lorsque :

  • "métadonnées étendues" est activé ;
  • une table comporte un déclencheur BEFORE INSERT ;
  • le déclencheur dépend d'une seule colonne et d'un seul générateur. Cette colonne est reconnue comme auto-incrémentée.

Spécification manuelle

Pour Oracle, d'autres cas Firebird / Interbase, et d'autres colonnes, le mode auto-incrémenté peut être spécifié par le programmeur, en utilisant l'une des options suivantes :

  • Définissez UpdateOptions.AutoIncFields sur la liste des noms de colonnes auto-incrémentées. Lorsque le type de données d'une colonne est dtInt32 / dtUInt32, le champ TFDAutoIncField est créé.
  • Créez un champ TFDAutoIncField à la conception ou à l'exécution. Le type de champ de la colonne doit être ftAutoInc / ftInteger / ftLongWord. Pour les autres types de données, envisagez d'utiliser un mappage de type TargetDataType = dtInt32.
  • Définissez TField.AutoGenerateValue sur arAutoInc pour un champ auto-incrémenté. Cette méthode ne crée pas un TFDAutoIncField. Elle fonctionne avec n'importe quel type de champ et peut nécessiter la définition d'autres propriétés de champ, comme ProviderFlags, Required et ReadOnly.

Toutes ces méthodes conduisent finalement à TField.AutoGenerateValue = arAutoInc.

Auto-incrémentation côté client

Par défaut, FireDAC utilise l'auto-incrémentation côté client pour les colonnes auto-incrémentées. Suite à l'appel de la méthode Insert / Append de l'ensemble de données, une colonne auto-incrémentée obtient la valeur -1. Lors de chaque appel de méthode suivant, la valeur est incrémentée de la valeur de pas -1 (négative). L'objectif est de distinguer les valeurs assignées côté client des valeurs assignées côté SGBD.

Lorsque UpdateOptions.RefreshMode <> rmManual, suite à la validation d'un nouvel enregistrement la colonne auto-incrémentée obtient une valeur positive réelle.

Les propriétés TFDAutoIncField permettent d'ajuster l'auto-incrémentation côté client :

Renseignement d'une séquence client

Lorsqu'un SGBD prend en charge les séquences ou les générateurs (ici les termes sont synonymes), FireDAC peut renseigner une colonne auto-incrémentée à partir d'une séquence sur un client. C'est une alternative à l'auto-incrémentation côté client.

La colonne auto-incrémentée doit comporter la valeur pfInUpdate dans TField.ProviderFlags, ainsi que l'une des valeurs UpdateOptions.FetchGeneratorsPoint :

  • gpImmediate -- la valeur suivante est déplacée depuis un générateur vers la méthode TDataSet.Insert / Append. La valeur est alors déjà accessible dans le gestionnaire d'événement TDataSet.OnNewRecord. Lorsque la méthode TDataSet.Cancel est appelée, la valeur est perdue.
  • gpDeferred -- la valeur suivante est déplacée vers la méthode TDataSet.Post.

Définissez UpdateOptions.GeneratorName ou TFDAutoIncField.GeneratorName sur un nom de générateur, qui sera utilisé pour obtenir la valeur de séquence suivante.

Configuration universelle

La configuration de colonne auto-incrémentée ci-dessous fonctionne dans n'importe quel SGBD. Elle prend en charge les colonnes auto-incrémentées natives et utilise des séquences et des déclencheurs :

Pour Oracle, Firebird et Interbase, il est requis de spécifier manuellement les colonnes auto-incrémentées. Pour les bases de données prenant en charge les types de données auto-incrémentés natifs, aucune configuration supplémentaire n'est requise. Mais le fait de les spécifier fonctionne dans tous les cas.

Gestion maître-détail

Lorsque des ensembles de données maître et détail sont liés par une colonne maître auto-incrémentée et que le mode Mises à jour en cache est activé, vous pouvez envisager d'utiliser le mode Mises à jour en cache centralisées avec propagation des modifications de l'ensemble de données maître vers les ensembles de données détail.

Voir aussi

Exemples