Nesta página, discutimos as estratégias a serem usadas para gerar valores de chave primária na sua tabela usando expressões de valor padrão. Essas estratégias têm os seguintes benefícios:
- Evitar o uso excessivo do ponto de acesso
- Simplifique migrações de outros bancos de dados
- Encapsule a lógica principal no banco de dados para que você não precise se preocupar com gerenciá-la no seu aplicativo.
É possível usar as seguintes estratégias em uma coluna que tenha expressões DEFAULT
:
- Uma função UUID que gera valores de UUID versão 4.
- Um objeto de esquema,
SEQUENCE
, que tem uma opçãobit_reversed_positive
.SEQUENCE
está disponível para GoogleSQL e PostgreSQL.
Métodos para gerar chaves primárias automaticamente
Identificador universalmente exclusivo (UUID)
O Spanner pode gerar automaticamente uma string UUID versão 4 para usar como chave primária. Os UUIDs funcionam bem para novos aplicativos e tabelas com muitas linhas. Eles são distribuídos de maneira quase uniforme no espaço da chave, o que evita o uso excessivo do ponto de acesso em grande escala. A geração de UUID pode criar um grande número de valores (2122), e cada valor é efetivamente único. Por exemplo, você precisaria de valores de 2, 71×1018 para 50% de probabilidade de colisão ou 1 bilhão por segundo durante 86 anos. Isso garante valores exclusivos quando usado em tabelas grandes. Os UUIDs são únicos, não importa se são gerados no banco de dados ou no cliente. Recomendamos que você use UUIDs quando possível. É possível misturar com segurança os UUIDs gerados pelo cliente e pelo Spanner na mesma tabela se os UUIDs gerados pelo cliente forem serializados como minúsculas, de acordo com o RFC 4122.
Para uma coluna que precisa de valores padrão, é possível usar a função GENERATE_UUID
para gerá-los. O exemplo a seguir mostra como criar uma tabela em que a coluna de chave FanId
tem GENERATE_UUID
na coluna de valor como valor padrão. O exemplo usa 36 caracteres para os atributos STRING
do GoogleSQL e varchar
do PostgreSQL porque os UUIDs têm 36 caracteres.
Quando você usa a instrução INSERT with THEN RETURN
para inserir na tabela Fans
, GENERATE_UUID
gera e retorna um valor UUID para 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);
Essa instrução retorna um resultado semelhante ao seguinte:
FanId |
---|
6af91072-f009-4c15-8c42-ebe38ae83751 |
Para mais informações sobre a função GENERATE_UUID()
, consulte a página de referência do GoogleSQL ou do PostgreSQL.
Sequência de bit invertido
Uma sequência invertida de bits é um objeto de esquema que produz uma sequência de números inteiros e a reverte em bits. Esse objeto usa a reversão de bits em um contador interno e particular do Spanner para garantir a exclusividade. Os valores revertidos de bits resultantes ajudam a evitar o uso excessivo do ponto de acesso em grande escala quando usados em uma chave primária.
No Spanner, você usa instruções DDL SEQUENCE
com o atributo bit_reversed_positive
para criar, alterar ou descartar uma sequência que produz valores positivos com reversão de bits (GoogleSQL ou PostgreSQL).
Cada sequência mantém um conjunto de contadores internos e os usa para gerar um valor. O contador de sequência fornece a entrada para o algoritmo de reversão de bits.
Quando você define uma coluna com uma expressão DEFAULT
que usa a função GET-NEXT-SEQUENCE-VALUE
do GoogleSQL ou a função nextval
do PostgreSQL como valor padrão, o Spanner chama automaticamente a função e coloca na coluna os valores de saída invertidos em bits. As sequências invertidas de bits são especialmente úteis para chaves primárias, porque os valores invertidos são distribuídos uniformemente pelo espaço da chave para que não causem uso excessivo do ponto de acesso.
O exemplo a seguir mostra como criar uma sequência de bits inversa e uma tabela em que a coluna de chave usa a sequência como valor padrão:
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)
);
Você pode usar a seguinte instrução SQL para inserir e retornar o valor da chave primária:
GoogleSQL
INSERT INTO Singers (Name) VALUES ('Melissa Garcia')
THEN RETURN SingerId;
PostgreSQL
INSERT INTO Singers (name) VALUES ('Melissa Garcia')
RETURNING (SingerId);
Essa instrução retorna um resultado semelhante ao seguinte:
SingerId |
---|
3458764513820540928 |
Cenários para usar UUIDs e sequências como valores padrão para chaves primárias
Os cenários para UUIDs e sequências incluem os seguintes:
- Novos aplicativos
- Migrações
As seções a seguir descrevem cada cenário.
Novos aplicativos
Se o aplicativo atual exigir chaves INT64
no GoogleSQL ou bigint
no PostgreSQL, o Spanner oferece o objeto de esquema de sequência positiva
revertida em bits (PostgreSQL ou GoogleSQL). Caso contrário, para novos aplicativos, recomendamos usar o Identificador universalmente exclusivo (UUID, na sigla em inglês). Para
mais informações, consulte Usar um identificador universal exclusivo (UUID).
Migrações
Para migrações de tabelas para o Spanner, você tem algumas opções:
- Se você estiver usando UUIDs no seu banco de dados de origem, no Spanner, será possível usar uma coluna de chave no tipo
STRING
e a funçãoGENERATE_UUID()
(GoogleSQL ou PostgreSQL) como valor padrão. - Se você estiver usando uma chave primária inteira e seu aplicativo só precisar que a
chave seja exclusiva, use uma coluna de chave em
INT64
e uma sequência positiva bit inversa para o valor padrão da chave primária. Consulte Como migrar colunas de chaves invertidas de bits. O Spanner não tem suporte para gerar valores monotônicos.
Se você estiver usando uma chave monotônica, como o tipo
SERIAL
do PostgreSQL ou o atributoAUTO_INCREMENT
do MySQL, e precisar de novas chaves monotônicas no Spanner, poderá usar uma chave composta. Consulte Trocar a ordem das chaves e Gerar um hash da chave exclusiva e espalhar as gravações em fragmentos lógicos.Se o aplicativo reverter manualmente a chave
INT64
no GoogleSQL oubigint
no PostgreSQL, será possível usar uma sequência positiva bit inversa (GoogleSQL ou PostgreSQL) e fazer com que ela gere novos valores de chave para você. Consulte Como migrar colunas de chaves invertidas de bits.
A seguir
- Saiba mais sobre o uso de sequências com controle de acesso detalhado.
- Saiba mais sobre as instruções
SEQUENCE
DDL para GoogleSQL ou PostgreSQL. - Saiba mais sobre as funções de sequência no GoogleSQL ou no PostgreSQL.
- Saiba mais sobre sequências em INFORMATION_SCHEMA no GoogleSQL ou no PostgreSQL.
- Saiba mais sobre as opções de sequência em INFORMATION_SCHEMA para GoogleSQL.