Questa pagina illustra le strategie da utilizzare per generare valori della chiave primaria nella tabella utilizzando espressioni di valore predefinito. Le informazioni riportate in questa pagina si applicano sia ai database in dialetto GoogleSQL sia ai database in dialetto PostgreSQL. Queste strategie presentano i seguenti vantaggi:
- Evitare gli hotspot
- Semplifica le migrazioni da altri database
- Incapsula la logica della chiave nel database in modo da non doverti preoccupare di gestirla nella tua applicazione
- Nella maggior parte dei casi, elimina la necessità di creare e gestire le tue sequenze
Metodi per generare automaticamente le chiavi primarie
Per generare automaticamente i valori della chiave primaria, puoi utilizzare le seguenti strategie in una colonna con espressioni DEFAULT
:
- Una funzione UUID che genera valori UUID versione 4.
- Un oggetto schema,
SEQUENCE
, che ha un'opzionebit_reversed_positive
.SEQUENCE
è disponibile sia per GoogleSQL sia per PostgreSQL.
Metodi per generare automaticamente le chiavi primarie
Questa sezione descrive come generare automaticamente UUID e sequenze con inversione di bit da utilizzare come valori delle chiavi principali.
Universally Unique Identifier (UUID)
Spanner può generare automaticamente una stringa UUID versione 4 da utilizzare come chiave primaria. Gli UUID sono adatti per nuove applicazioni e tabelle con molte righe. Sono distribuiti in modo approssimativamente uniforme nello spazio delle chiavi, il che impedisce la formazione di hotspot su larga scala. La generazione di UUID può creare un numero elevato di valori (2122) e ogni valore è effettivamente univoco. Ad esempio, ti occorrerebbero valori di 2, 71 x 1018 per una probabilità del 50% di collisione o 1 miliardo al secondo per 86 anni. In questo modo, avrai valori univoci quando li utilizzi in tabelle di grandi dimensioni. Gli UUID sono univoci indipendentemente dal fatto che li generi nel database o nel client. Ti consigliamo di utilizzare gli UUID, se possibile. Puoi combinare in sicurezza gli UUID generati dal client e da Spanner nella stessa tabella se gli UUID generati dal client sono serializzati in minuscolo, in conformità con la RFC 4122.
Per una colonna che richiede valori predefiniti, puoi utilizzare la funzione GENERATE_UUID
per generarli. L'esempio seguente mostra come creare una tabella in cui la colonna della chiave FanId
ha GENERATE_UUID
come valore predefinito nella colonna del valore.
L'esempio utilizza 36 caratteri per gli attributi GoogleSQLSTRING
e PostgreSQL varchar
perché gli UUID hanno 36 caratteri. Quando utilizzi l'istruzione INSERT with THEN RETURN
per inserire
nella tabella Fans
, GENERATE_UUID
genera e restituisce un valore UUID per
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);
Questa istruzione restituisce un risultato simile al seguente:
FanId |
---|
6af91072-f009-4c15-8c42-ebe38ae83751 |
Per saperne di più sulla funzione GENERATE_UUID()
, consulta la pagina di riferimento di GoogleSQL o PostgreSQL.
IDENTITY
colonne
Con le colonne IDENTITY
, puoi generare automaticamente valori interi per le colonne chiave e non chiave. Le colonne IDENTITY
non richiedono agli utenti di gestire manualmente una sequenza sottostante o il rapporto tra la colonna e la sequenza sottostante. Quando viene eliminata una colonna di identità generata automaticamente, viene eliminata automaticamente anche la sequenza sottostante.
Puoi utilizzare le colonne IDENTITY
fornendo un valore intero iniziale quando generi la sequenza o lasciando che sia Spanner a generare la sequenza di interi. Per fornire un valore intero iniziale, devi utilizzare l'opzione START COUNTER WITH
e un valore iniziale INT64
positivo.
Spanner utilizza questo valore per impostare il valore successivo per il suo
contatore di sequenza interno generato automaticamente e ne esegue il bit-reverse prima di
inserirlo in questa colonna.
In Spanner, le colonne IDENTITY
sono supportate sia in GoogleSQL sia in PostgreSQL.
GoogleSQL
L'esempio seguente mostra come utilizzare le colonne IDENTITY
per creare una colonna della chiave primaria di tipo intero generata automaticamente per SingerId
quando viene creata una nuova tabella utilizzando il comando CREATE TABLE
:
CREATE TABLE Singers (
SingerId INT64 GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
Name STRING(MAX),
Rank INT64
) PRIMARY KEY (SingerId);
Puoi anche specificare l'inizio del contatore per la colonna utilizzando l'opzione START_WITH_COUNTER
. Nell'esempio seguente viene creata una colonna di interi generata automaticamente per SingerId
con valori positivi con inversione di bit e un contatore interno che inizia da 1000.
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'esempio seguente mostra come utilizzare le colonne IDENTITY
per creare una colonna di interi generata automaticamente per SingerId
quando crei una nuova tabella utilizzando il comando CREATE
TABLE
:
CREATE TABLE Singers (
SingerId bigint GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
Name text,
PRIMARY KEY (SingerId)
);
Puoi anche specificare l'inizio del contatore per la colonna utilizzando l'opzione START COUNTER WITH
. Nell'esempio seguente, viene creata una colonna di interi generata automaticamente per SingerId
che genera valori positivi con inversione dei bit e il contatore interno, prima dell'inversione dei bit, inizia da 1000.
CREATE TABLE Singers (
SingerId bigint GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE START COUNTER WITH 1000),
Name text,
PRIMARY KEY (SingerId)
);
SERIAL e AUTO_INCREMENT
Spanner supporta SERIAL
in PostgreSQL e
AUTO_INCREMENT
in GoogleSQL, che sono alias DDL per le colonne IDENTITY
e vengono utilizzati per creare colonne di interi univoci. Devi prima impostare l'opzione database
default_sequence_kind
prima di utilizzare SERIAL
o AUTO_INCREMENT
.
Puoi utilizzare la seguente istruzione SQL per impostare l'opzione default_squence_kind
del database:
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
);
Tieni presente che, poiché SERIAL
e AUTO_INCREMENT
corrispondono alle colonne IDENTITY, non li vedrai quando esegui la serializzazione dello schema. Per questo schema, l'output di
GetDatabaseDDL
sarà:
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)
);
Sequenza con inversione dei bit
Una sequenza con inversione dei bit è un oggetto dello schema che produce una sequenza di interi e li inverte. Questo oggetto utilizza l'inversione dei bit su un contatore Spanner interno privato per garantire l'unicità. I valori con inversione dei bit risultanti aiutano a evitare hotspot su larga scala se utilizzati in una chiave primaria.
In Spanner, utilizzi le istruzioni DDL SEQUENCE
insieme all'attributo bit_reversed_positive
per creare, modificare o eliminare una sequenza che produce valori positivi con inversione dei bit (GoogleSQL o
PostgreSQL).
Ogni sequenza gestisce un insieme di contatori interni e li utilizza per generare un valore. Il contatore di sequenza fornisce l'input all'algoritmo di inversione dei bit.
Quando definisci una colonna con un'espressione DEFAULT
che utilizza la funzione GET-NEXT-SEQUENCE-VALUE
di GoogleSQL o la funzione nextval
di PostgreSQL come valore predefinito, Spanner chiama automaticamente la funzione e inserisce i valori di output con inversione dei bit nella colonna. Le sequenze con inversione dei bit sono particolarmente utili per le chiavi principali, poiché i valori con inversione dei bit sono distribuiti uniformemente nello spazio delle chiavi in modo da non creare hot spot.
L'esempio seguente mostra come creare una sequenza con inversione di bit e una tabella in cui la colonna della chiave utilizza la sequenza come valore predefinito:
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)
);
Puoi quindi utilizzare la seguente istruzione SQL per inserire e restituire il valore della chiave primaria:
GoogleSQL
INSERT INTO Singers (Name) VALUES ('Melissa Garcia')
THEN RETURN SingerId;
PostgreSQL
INSERT INTO Singers (name) VALUES ('Melissa Garcia')
RETURNING (SingerId);
Questa istruzione restituisce un risultato simile al seguente:
SingerId |
---|
3458764513820540928 |
Scenari per l'utilizzo di UUID e sequenze come valori predefiniti per le chiavi principali
Gli scenari per UUID e sequenze includono:
- Nuove applicazioni
- Migrazioni
Le sezioni seguenti descrivono ciascun scenario.
Nuove applicazioni
Se la tua applicazione esistente richiede chiavi INT64
in GoogleSQL o chiavi bigint
in PostgreSQL, Spanner offre l'oggetto schema di sequenza positiva con inversione dei bit (PostgreSQL o
GoogleSQL). In caso contrario, per le nuove applicazioni ti consigliamo di utilizzare un UUID (Universally Unique Identifier).
Per ulteriori informazioni, consulta Usare un UUID (Universally Unique Identifier).
Migrazioni
Per le migrazioni delle tabelle in Spanner, hai a disposizione alcune opzioni:
- Se utilizzi UUID nel database di origine, su Spanner puoi utilizzare una colonna chiave nel tipo
STRING
e nella funzioneGENERATE_UUID()
(GoogleSQL o PostgreSQL) come valore predefinito. - Se utilizzi una chiave primaria intera e la tua applicazione richiede solo che la chiave sia univoca, puoi utilizzare una colonna della chiave in
INT64
e una sequenza positiva con inversione di bit per il valore predefinito della chiave primaria. Consulta Eseguire la migrazione delle colonne di chiavi con inversione di bit. Spanner non supporta un modo per generare valori monotoni.
Se utilizzi una chiave monotona, ad esempio il tipo
SERIAL
di PostgreSQL o l'attributoAUTO_INCREMENT
di MySQL, e hai bisogno di nuove chiavi monotone su Spanner, puoi utilizzare una chiave composta. Per ulteriori informazioni, consulta Scambiare l'ordine delle chiavi e Eseguire l'hash della chiave univoca e distribuire le scritture tra i frammenti logici.Se la tua applicazione esegue manualmente l'inversione a livello di bit della chiave
INT64
in GoogleSQL o della chiavebigint
in PostgreSQL, puoi utilizzare una sequenza positiva con inversione a livello di bit (GoogleSQL o PostgreSQL) e generare nuovi valori chiave. Per maggiori informazioni, consulta Eseguire la migrazione delle colonne di chiavi con inversione dei bit.
Passaggi successivi
- Scopri di più sull'utilizzo delle sequenze con il controllo dell'accesso granulare.
- Scopri di più sulle istruzioni
SEQUENCE
DDL per GoogleSQL o PostgreSQL. - Scopri di più sulle funzioni di sequenza in GoogleSQL o PostgreSQL.
- Scopri di più sulle sequenze in INFORMATION_SCHEMA in GoogleSQL o PostgreSQL.
- Scopri le opzioni di sequenza in INFORMATION_SCHEMA per GoogleSQL.