Champs auto-incrémentés (FireDAC)
Remonter à Modification des données (FireDAC)
Sommaire
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 |
|
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 |
|
|
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 :
- TField.DataType = ftAutoInc (TFDAutoIncField) lorsque le type de données est dtInt32 ou dtUInt32 ; sinon, l'un des types de données ftXxxx numériques ;
- TField.Required = False ;
- TField.ReadOnly = True ;
- TField.ProviderFlags = [pfInWhere] ou [pfInWhere, pfInKey] lorsque la colonne fait partie d'une clé primaire.
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 :
- ClientAutoIncrement pour activer ou désactiver ;
- AutoIncrementSeed pour spécifier une valeur initiale ;
- AutoIncrementStep pour spécifier une valeur de pas.
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 :
- Lorsque UpdateOptions.FetchGeneratorsPoint =
gpNone
, le renseignement de la séquence client est désactivé. - Lorsque pfInUpdate est la valeur de TField.ProviderFlags, la colonne est exclue de la clause INSERT / UPDATE.
- Lorsque FetchOptions.Items est défini sur fiMeta, la colonne est reconnue comme auto-incrémentée.
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
- Exemple Champs FireDAC Autoinc