Cette page présente les stratégies à utiliser pour générer des valeurs de clé primaire dans votre tableau à l'aide d'expressions de valeur par défaut. Les informations de cette page s'appliquent aux bases de données utilisant le dialecte GoogleSQL et celles utilisant le dialecte PostgreSQL. Ces stratégies présentent les avantages suivants :
- Éviter les hotspots
- Simplifier les migrations à partir d'autres bases de données
- Encapsulez la logique clé dans la base de données pour ne pas avoir à vous soucier de sa gestion dans votre application.
- Dans la plupart des cas, il n'est plus nécessaire de créer et de gérer vos propres séquences.
Méthodes pour générer automatiquement des clés primaires
Pour générer automatiquement des valeurs de clé primaire, vous pouvez utiliser les stratégies suivantes dans une colonne contenant des expressions DEFAULT :
- Fonction UUID qui génère des valeurs UUID de version 4.
- Colonnes
IDENTITYqui génèrent automatiquement des valeurs entières pour les colonnes clés et non clés. SERIALdans PostgreSQL etAUTO_INCREMENTdans GoogleSQL, qui sont des alias LDD pour les colonnesIDENTITY.- Objet schéma,
SEQUENCE, qui comporte une optionbit_reversed_positive.SEQUENCEest disponible pour GoogleSQL et PostgreSQL.
Identifiant unique universel (UUID)
Spanner peut générer automatiquement une chaîne UUID version 4 à utiliser comme clé primaire. Les UUID conviennent aux nouvelles applications et aux tables comportant de nombreuses lignes. Ils sont répartis de manière à peu près uniforme dans l'espace de clés, ce qui évite les points chauds à grande échelle. La génération d'UUID peut créer un grand nombre de valeurs (2122), et chaque valeur est effectivement unique. Par exemple, vous auriez besoin de 2,71 × 1018 valeurs pour une probabilité de collision de 50 %, soit un milliard par seconde pendant 86 ans. Cela garantit des valeurs uniques lorsque vous l'utilisez dans de grands tableaux. Les UUID sont uniques, que vous les génériez dans la base de données ou dans le client. Nous vous recommandons d'utiliser des UUID lorsque cela est possible. Vous pouvez mélanger en toute sécurité les UUID générés par le client et par Spanner dans la même table si les UUID générés par le client sont sérialisés en minuscules, conformément à la RFC 4122.
Pour une colonne qui a besoin de valeurs par défaut, vous pouvez utiliser la fonction GENERATE_UUID pour les générer. L'exemple suivant montre comment créer une table dans laquelle la colonne clé FanId a GENERATE_UUID comme valeur par défaut dans la colonne de valeurs.
L'exemple utilise 36 caractères pour les attributs STRING GoogleSQL et varchar PostgreSQL, car les UUID comportent 36 caractères. Lorsque vous utilisez l'instruction INSERT with THEN RETURN pour insérer des données dans la table Fans, GENERATE_UUID génère et renvoie une valeur UUID pour FanId.
GoogleSQL
CREATE TABLE Fans (
FanId STRING(36) DEFAULT (GENERATE_UUID()),
Name STRING(MAX),
) PRIMARY KEY (FanId);
PostgreSQL
CREATE TABLE Fans (
FanId varchar(36) DEFAULT spanner.generate_uuid(),
Name text,
PRIMARY KEY (FanId)
);
GoogleSQL
INSERT INTO Fans (Name) VALUES ('Melissa Garcia')
THEN RETURN FanId;
PostgreSQL
INSERT INTO fans (name) VALUES ('Melissa Garcia')
RETURNING (fanid);
Cette instruction renvoie un résultat semblable à celui-ci :
| FanId |
|---|
| 6af91072-f009-4c15-8c42-ebe38ae83751 |
Pour en savoir plus sur la fonction GENERATE_UUID(), consultez la page de référence GoogleSQL ou PostgreSQL.
IDENTITY colonnes
Les colonnes IDENTITY vous permettent de générer automatiquement des valeurs entières pour les colonnes clés et non clés. Les colonnes IDENTITY n'obligent pas les utilisateurs à gérer manuellement une séquence sous-jacente ni à gérer la relation entre la colonne et la séquence sous-jacente. Lorsqu'une colonne d'identité générée automatiquement est supprimée, la séquence sous-jacente est également supprimée automatiquement.
Vous pouvez utiliser les colonnes IDENTITY en fournissant une valeur entière de départ lors de la génération de la séquence ou en laissant Spanner générer la séquence d'entiers pour vous. Pour fournir une valeur entière de départ, vous devez utiliser l'option START COUNTER WITH et une valeur de départ INT64 positive.
Spanner utilise cette valeur pour définir la valeur suivante de son compteur de séquence interne généré automatiquement et inverse les bits de la valeur avant de l'insérer dans cette colonne.
Dans Spanner, les colonnes IDENTITY sont compatibles avec GoogleSQL et PostgreSQL.
GoogleSQL
L'exemple suivant montre comment utiliser les colonnes IDENTITY pour créer une colonne de clé primaire entière générée automatiquement pour SingerId lors de la création d'une table à l'aide de la commande CREATE TABLE :
CREATE TABLE Singers (
SingerId INT64 GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
Name STRING(MAX),
Rank INT64
) PRIMARY KEY (SingerId);
Vous pouvez également spécifier le début du compteur pour la colonne à l'aide de l'option START_WITH_COUNTER. Dans l'exemple suivant, une colonne d'entiers générée automatiquement est créée pour SingerId. Elle contient des valeurs positives inversées au niveau des bits et un compteur interne qui commence à 1 000.
CREATE TABLE Singers (
SingerId INT64 GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE START COUNTER WITH 1000),
Name STRING(MAX),
Rank INT64
) PRIMARY KEY (SingerId);
PostgreSQL
L'exemple suivant montre comment utiliser les colonnes IDENTITY pour créer une colonne d'entiers générée automatiquement pour SingerId lors de la création d'une table à l'aide de la commande CREATE
TABLE :
CREATE TABLE Singers (
SingerId bigint GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
Name text,
PRIMARY KEY (SingerId)
);
Vous pouvez également spécifier le début du compteur pour la colonne à l'aide de l'option START COUNTER WITH. Dans l'exemple suivant, une colonne d'entiers générée automatiquement est créée pour SingerId, ce qui génère des valeurs positives inversées par bit. Le compteur interne, avant l'inversion par bit,commence à 1 000.
CREATE TABLE Singers (
SingerId bigint GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE START COUNTER WITH 1000),
Name text,
PRIMARY KEY (SingerId)
);
SERIAL et AUTO_INCREMENT
Spanner est compatible avec SERIAL dans PostgreSQL et AUTO_INCREMENT dans GoogleSQL, qui sont des alias LDD pour les colonnes IDENTITY et sont utilisés pour créer des colonnes d'entiers uniques. Vous devez d'abord définir l'option default_sequence_kind de la base de données avant d'utiliser SERIAL ou AUTO_INCREMENT.
Vous pouvez utiliser l'instruction SQL suivante pour définir l'option default_squence_kind de la base de données :
GoogleSQL
ALTER DATABASE db SET OPTIONS (default_sequence_kind = 'bit_reversed_positive');
CREATE TABLE Singers (
id INT64 AUTO_INCREMENT PRIMARY KEY,
name STRING(MAX),
)
PostgreSQL
ALTER DATABASE db SET spanner.default_sequence_kind = 'bit_reversed_positive';
CREATE TABLE Singers (
id serial PRIMARY KEY,
name text
);
Notez que, comme SERIAL et AUTO_INCREMENT sont mappés sur des colonnes IDENTITY, vous ne les verrez pas lorsque vous sérialiserez votre schéma. Pour ce schéma, le résultat de GetDatabaseDDL serait le suivant :
GoogleSQL
ALTER DATABASE db SET OPTIONS (default_sequence_kind = 'bit_reversed_positive');
CREATE TABLE Singers (
id INT64 GENERATED BY DEFAULT AS IDENTITY,
name STRING(MAX),
) PRIMARY KEY (id);
PostgreSQL
ALTER DATABASE db SET spanner.default_sequence_kind = 'bit_reversed_positive';
CREATE TABLE Singers (
id bigint GENERATED BY DEFAULT AS IDENTITY NOT NULL,
name character varying,
PRIMARY KEY(id)
);
Séquence inversée par bit
Une séquence inversée par bits est un objet de schéma qui produit une séquence d'entiers et les inverse par bits. Cet objet utilise l'inversion de bits sur un compteur Spanner interne et privé pour garantir l'unicité. Les valeurs inversées bit à bit qui en résultent permettent d'éviter les hotspots à grande échelle lorsqu'elles sont utilisées dans une clé primaire.
Dans Spanner, vous utilisez des instructions DDL SEQUENCE avec l'attribut bit_reversed_positive pour créer, modifier ou supprimer une séquence qui produit des valeurs positives inversées bit à bit (GoogleSQL ou PostgreSQL).
Chaque séquence gère un ensemble de compteurs internes et les utilise pour générer une valeur. Le compteur de séquence fournit l'entrée à l'algorithme d'inversion de bits.
Lorsque vous définissez une colonne avec une expression DEFAULT qui utilise la fonction GoogleSQL GET-NEXT-SEQUENCE-VALUE ou la fonction PostgreSQL nextval comme valeur par défaut, Spanner appelle automatiquement la fonction et place les valeurs de sortie inversées dans la colonne. Les séquences inversées sont particulièrement utiles pour les clés primaires, car les valeurs inversées sont réparties de manière uniforme dans l'espace de clés, ce qui évite les points chauds.
L'exemple suivant montre comment créer une séquence inversée par bits et un tableau dont la colonne clé utilise la séquence comme valeur par défaut :
GoogleSQL
CREATE SEQUENCE SingerIdSequence OPTIONS (
sequence_kind="bit_reversed_positive"
);
CREATE TABLE Singers (
SingerId INT64 DEFAULT (GET_NEXT_SEQUENCE_VALUE(SEQUENCE SingerIdSequence)),
Name STRING(MAX),
Rank INT64,
) PRIMARY KEY (SingerId);
PostgreSQL
CREATE SEQUENCE SingerIdSequence bit_reversed_positive;
CREATE TABLE Singers (
SingerId bigint DEFAULT nextval('SingerIdSequence'),
Name text,
PRIMARY KEY (SingerId)
);
Vous pouvez ensuite utiliser l'instruction SQL suivante pour insérer et renvoyer la valeur de la clé primaire :
GoogleSQL
INSERT INTO Singers (Name) VALUES ('Melissa Garcia')
THEN RETURN SingerId;
PostgreSQL
INSERT INTO Singers (name) VALUES ('Melissa Garcia')
RETURNING (SingerId);
Cette instruction renvoie un résultat semblable à celui-ci :
| SingerId |
|---|
| 3458764513820540928 |
Scénarios d'utilisation des UUID et des séquences comme valeurs par défaut pour les clés primaires
Voici les scénarios pour les UUID et les séquences :
- Nouvelles applications
- Migrations
Les sections suivantes décrivent chaque scénario.
Nouvelles applications
Si votre application existante nécessite des clés INT64 dans GoogleSQL ou des clés bigint dans PostgreSQL, Spanner propose l'objet de schéma de séquence positive inversée par bits (PostgreSQL ou
GoogleSQL). Sinon, pour les nouvelles applications, nous vous recommandons d'utiliser un identifiant unique universel (UUID).
Pour en savoir plus, consultez Utiliser un identifiant unique universel (UUID).
Migrations
Pour migrer des tables vers Spanner, vous avez plusieurs options :
- Si vous utilisez des UUID dans votre base de données source, vous pouvez utiliser une colonne clé de type
STRINGet la fonctionGENERATE_UUID()(GoogleSQL ou PostgreSQL) comme valeur par défaut sur Spanner. - Si vous utilisez une clé primaire entière et que votre application n'a besoin que d'une clé unique, vous pouvez utiliser une colonne de clé dans
INT64et utiliser une séquence positive inversée pour la valeur par défaut de la clé primaire. Consultez Migrer les colonnes de clés inversées par bits. Spanner ne permet pas de générer des valeurs monotones.
Si vous utilisez une clé monotone, telle que le type
SERIALPostgreSQL ou l'attributAUTO_INCREMENTMySQL, et que vous avez besoin de nouvelles clés monotones sur Spanner, vous pouvez utiliser une clé composite. Pour en savoir plus, consultez Inverser l'ordre des clés et Hacher la clé unique et répartir les écritures sur des segments logiques.Si votre application inverse manuellement les bits de votre clé
INT64dans GoogleSQL ou de votre clébigintdans PostgreSQL, vous pouvez utiliser une séquence positive inversée (GoogleSQL ou PostgreSQL) pour générer de nouvelles valeurs de clé. Pour en savoir plus, consultez Migrer des colonnes de clés inversées par bits.
Étapes suivantes
- En savoir plus sur l'utilisation des séquences avec le contrôle précis des accès
- En savoir plus sur les instructions DDL
SEQUENCEpour GoogleSQL ou PostgreSQL. - En savoir plus sur les fonctions de séquence dans GoogleSQL ou PostgreSQL
- En savoir plus sur les séquences dans INFORMATION_SCHEMA dans GoogleSQL ou PostgreSQL
- Découvrez les options de séquence dans INFORMATION_SCHEMA pour GoogleSQL.