Cette page présente les stratégies à utiliser pour générer des valeurs de clé primaire dans votre table à l'aide d'expressions de valeur par défaut. Ces stratégies présentent les avantages suivants:
- Empêcher le point d'accès
- Simplifier les migrations à partir d'autres bases de données
- Encapsulez la logique de la clé dans la base de données afin de ne pas avoir à vous soucier de sa gestion dans votre application.
Vous pouvez utiliser les stratégies suivantes dans une colonne comportant des expressions DEFAULT
:
- Fonction UUID qui génère des valeurs UUID version 4.
- Un objet de schéma,
SEQUENCE
, avec l'optionbit_reversed_positive
SEQUENCE
est disponible pour GoogleSQL et PostgreSQL.
Méthodes permettant de générer automatiquement des clés primaires
Identifiant unique universel (UUID)
Spanner peut générer automatiquement une chaîne de l'UUID version 4 à utiliser comme clé primaire. Les UUID fonctionnent bien pour les nouvelles applications et les tables comportant de nombreuses lignes. Ils sont répartis de manière relativement uniforme sur l'espace clé, ce qui évite le hotspotting à grande échelle. La génération d'UUID peut créer un grand nombre de valeurs (2122), et chaque valeur est dans les faits unique. Par exemple, vous aurez besoin de valeurs 2,71 × 1018 pour une probabilité de collision de 50 %, ou 1 milliard par seconde pendant 86 ans. Cela garantit des valeurs uniques lorsque vous l'utilisez dans de grandes tables. Que vous les génériez dans la base de données ou dans le client, les UUID sont uniques. 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 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 nécessitant des 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 de clé FanId
contient GENERATE_UUID
comme valeur par défaut dans la colonne de valeur. L'exemple utilise 36 caractères pour les attributs GoogleSQL STRING
et PostgreSQL varchar
, car les UUID comportent 36 caractères.
Lorsque vous utilisez l'instruction INSERT with THEN RETURN
pour insérer un bloc 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 sur GoogleSQL ou PostgreSQL.
Séquence inversée de bits
Une séquence d'inversion de bits est un objet de schéma qui produit une séquence d'entiers et les inverse. Cet objet utilise l'inversion des bits sur un compteur Spanner interne privé pour garantir l'unicité. Les valeurs inversées de bits qui en résultent permettent d'éviter le hotspotting à grande échelle lorsqu'elles sont utilisées dans une clé primaire.
Dans Spanner, vous utilisez des instructions LDD SEQUENCE
avec l'attribut bit_reversed_positive
pour créer, modifier ou supprimer une séquence qui génère des valeurs positives inversées (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 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 de bits sont particulièrement utiles pour les clés primaires, car les valeurs inversées de bits sont réparties uniformément dans l'espace de clés afin d'éviter le hotspotting.
L'exemple suivant montre comment créer une séquence d'inversion de bits et une table dans laquelle sa colonne de 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 insérer et renvoyer la valeur de la clé primaire à l'aide de l'instruction SQL suivante:
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
Les scénarios pour les UUID et les séquences sont les suivants:
- Nouvelles applications
- Migrations
Les sections suivantes décrivent chaque scénario.
Nouvelles applications
Si votre application existante nécessite des clés INT64
en GoogleSQL ou des clés bigint
en PostgreSQL, Spanner propose l'objet de schéma de séquence positive inversée (PostgreSQL ou GoogleSQL). Sinon, pour les nouvelles applications, nous vous recommandons d'utiliser un identifiant unique universel (UUID). Pour en savoir plus, consultez la section Utiliser un identifiant unique universel (UUID).
Migrations
Pour les migrations de tables vers Spanner, plusieurs options s'offrent à vous:
- Si vous utilisez des UUID dans votre base de données source, sur Spanner, vous pouvez utiliser une colonne de clé de type
STRING
et la fonctionGENERATE_UUID()
(GoogleSQL ou PostgreSQL) comme valeur par défaut. - 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
INT64
et utiliser une séquence positive d'inversion de bits pour la valeur par défaut de la clé primaire. Consultez la section Migrer des colonnes de clé inversée par bits. Spanner ne propose aucun moyen de générer des valeurs monotones.
Si vous utilisez une clé monotone, telle que le type PostgreSQL
SERIAL
ou l'attribut MySQLAUTO_INCREMENT
et que vous avez besoin de nouvelles clés monotones sur Spanner, vous pouvez utiliser une clé composite. Consultez Échanger l'ordre des clés et Hacher la clé unique et répartir les écritures sur des segments logiques.Si votre application effectue une inversion manuelle de votre clé
INT64
dans GoogleSQL oubigint
en PostgreSQL, vous pouvez utiliser une séquence positive d'inversion de bits (GoogleSQL ou PostgreSQL) et faire en sorte qu'elle génère de nouvelles valeurs de clé pour vous. Consultez la section Migrer des colonnes de clé inversée par bits.
Étapes suivantes
- En savoir plus sur l'utilisation de séquences avec un contrôle des accès précis.
- Découvrez les instructions LDD
SEQUENCE
pour GoogleSQL ou PostgreSQL. - Familiarisez-vous avec les fonctions de séquence dans GoogleSQL ou PostgreSQL.
- Obtenez plus d'informations sur les séquences dans INFORMATION_Schéma en GoogleSQL ou PostgreSQL.
- Apprenez-en plus sur les options de séquence dans INFORMATION_Schéma pour GoogleSQL.