En esta página, se analizan las estrategias que se pueden usar para generar valores de clave primaria en tu tabla con expresiones de valor predeterminado. La información de esta página se aplica a las bases de datos de dialecto de Google SQL y de dialecto de PostgreSQL. Estas estrategias tienen los siguientes beneficios:
- Evita los hotspots
- Simplifica las migraciones desde otras bases de datos
- Encapsula la lógica de claves en la base de datos para que no tengas que preocuparte por administrarla en tu aplicación.
- En la mayoría de los casos, reemplaza la necesidad de crear y administrar tus propias secuencias.
Métodos para generar claves primarias automáticamente
Para generar automáticamente valores de clave primaria, puedes usar las siguientes estrategias en una columna que tenga expresiones DEFAULT
:
- Es una función UUID que genera valores de UUID de versión 4.
- Un objeto de esquema,
SEQUENCE
, que tiene una opciónbit_reversed_positive
.SEQUENCE
está disponible para GoogleSQL y PostgreSQL.
Métodos para generar claves primarias automáticamente
En esta sección, se describe cómo generar automáticamente UUID y secuencias con bits invertidos para usar como valores de claves primarias.
Identificador único universal (UUID)
Spanner puede generar automáticamente una cadena de UUID versión 4 para usarla como clave primaria. Los UUID funcionan bien para aplicaciones y tablas nuevas con muchas filas. Se distribuyen de forma aproximadamente uniforme en el espacio de claves, lo que evita puntos calientes a gran escala. La generación de UUID puede crear una gran cantidad de valores (2122) y cada valor es, en efecto, único. Por ejemplo, necesitarías 2.71 × 1018 valores para una probabilidad de colisión del 50%, o 1,000 millones por segundo durante 86 años. Esto garantiza valores únicos cuando lo usas en tablas grandes. Los UUID son únicos, ya sea que los generes en la base de datos o en el cliente. Te recomendamos que uses UUIDs siempre que sea posible. Puedes combinar de forma segura los UUID generados por el cliente y Spanner en la misma tabla si los UUID generados por el cliente se serializan en minúsculas, de acuerdo con la RFC 4122.
Para una columna que necesita valores predeterminados, puedes usar la función GENERATE_UUID
para generarlos. En el siguiente ejemplo, se muestra cómo crear una tabla en la que la columna de clave FanId
tenga GENERATE_UUID
en la columna de valor como valor predeterminado.
En el ejemplo, se usan 36 caracteres para los atributos STRING
de GoogleSQL y varchar
de PostgreSQL porque los UUIDs tienen 36 caracteres. Cuando usas la sentencia INSERT with THEN RETURN
para insertar en la tabla Fans
, GENERATE_UUID
genera y muestra un valor de UUID para FanId
.
CREATE TABLE Fans (
FanId STRING(36) DEFAULT (GENERATE_UUID()),
Name STRING(MAX),
) PRIMARY KEY (FanId);
CREATE TABLE Fans (
FanId varchar(36) DEFAULT spanner.generate_uuid(),
Name text,
PRIMARY KEY (FanId)
);
INSERT INTO Fans (Name) VALUES ('Melissa Garcia')
THEN RETURN FanId;
INSERT INTO fans (name) VALUES ('Melissa Garcia')
RETURNING (fanid);
Esta sentencia muestra un resultado similar al siguiente:
FanId |
---|
6af91072-f009-4c15-8c42-ebe38ae83751 |
Para obtener más información sobre la función GENERATE_UUID()
, consulta la página de referencia de GoogleSQL o PostgreSQL.
IDENTITY
columnas
Con las columnas IDENTITY
, puedes generar automáticamente valores de números enteros para columnas clave y no clave. Las columnas IDENTITY
no requieren que los usuarios mantengan manualmente una secuencia subyacente ni que administren la relación entre la columna y la secuencia subyacente. Cuando se descarta una columna de identidad generada automáticamente, también se borra automáticamente la secuencia subyacente.
Puedes usar columnas IDENTITY
proporcionando un valor de número entero inicial cuando generas la secuencia o permitiendo que Spanner genere la secuencia de números enteros por ti. Para proporcionar un valor de número entero inicial, debes usar la opción START COUNTER WITH
y un valor inicial INT64
positivo.
Spanner usa este valor para establecer el siguiente valor para su contador de secuencias interno generado automáticamente y cambia el valor de bits antes de insertarlo en esta columna.
En Spanner, las columnas IDENTITY
son compatibles con GoogleSQL y PostgreSQL.
En el siguiente ejemplo, se muestra cómo usar columnas IDENTITY
para crear una columna de clave primaria de número entero generada automáticamente para SingerId
cuando se crea una tabla nueva con el comando CREATE TABLE
:
CREATE TABLE Singers (
SingerId INT64 GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
Name STRING(MAX),
Rank INT64
) PRIMARY KEY (SingerId);
También puedes especificar el inicio del contador de la columna con la opción START_WITH_COUNTER
. En el siguiente ejemplo, se crea una columna de números enteros generada automáticamente para SingerId
que tiene valores positivos con bits invertidos y un contador interno que comienza en 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);
En el siguiente ejemplo, se muestra cómo usar columnas IDENTITY
para crear una columna de número entero generada automáticamente para SingerId
cuando creas una tabla nueva con el comando CREATE
TABLE
:
CREATE TABLE Singers (
SingerId bigint GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
Name text,
PRIMARY KEY (SingerId)
);
También puedes especificar el inicio del contador de la columna con la opción START COUNTER WITH
. En el siguiente ejemplo, se crea una columna de número entero generada automáticamente para SingerId
que genera valores positivos con bits invertidos, y el contador interno, antes de invertir los bits, comienza desde 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 y AUTO_INCREMENT
Spanner admite SERIAL
en PostgreSQL y
AUTO_INCREMENT
en GoogleSQL, que son alias de DDL para columnas IDENTITY
y se usan para crear columnas de números enteros únicas. Primero, debes configurar la opción default_sequence_kind
de la base de datos antes de usar SERIAL
o AUTO_INCREMENT
.
Puedes usar la siguiente sentencia SQL para establecer la opción default_squence_kind
de la base de datos:
ALTER DATABASE db SET OPTIONS (default_sequence_kind = 'bit_reversed_positive');
CREATE TABLE Singers (
id INT64 AUTO_INCREMENT PRIMARY KEY,
name STRING(MAX),
)
ALTER DATABASE db SET spanner.default_sequence_kind = 'bit_reversed_positive';
CREATE TABLE Singers (
id serial PRIMARY KEY,
name text
);
Ten en cuenta que, como SERIAL
y AUTO_INCREMENT
se asignan a columnas IDENTITY, no las verás cuando serialices tu esquema. Para este esquema, el resultado de GetDatabaseDDL
sería el siguiente:
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);
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)
);
Secuencia con bits invertidos
Una secuencia con inversión de bits es un objeto de esquema que produce una secuencia de números enteros y los invierte. Este objeto usa la inversión de bits en un contador interno y privado de Spanner para garantizar la unicidad. Los valores con bits invertidos resultantes ayudan a evitar hotspots a gran escala cuando se usan en una clave primaria.
En Spanner, usas instrucciones DDL SEQUENCE
junto con el atributo bit_reversed_positive
para crear, alterar o descartar una secuencia que produce valores positivos con bits invertidos (GoogleSQL o PostgreSQL).
Cada secuencia mantiene un conjunto de contadores internos y los usa para generar un valor. El contador de secuencias proporciona la entrada al algoritmo de inversión de bits.
Cuando defines una columna con una expresión DEFAULT
que usa la función GET-NEXT-SEQUENCE-VALUE
de GoogleSQL o la función nextval
de PostgreSQL como valor predeterminado, Spanner llama automáticamente a la función y coloca los valores de salida con bits invertidos en la columna. Las secuencias con inversión de bits son especialmente útiles para las claves primarias, ya que los valores con inversión de bits se distribuyen de manera uniforme en el espacio de claves para que no generen puntos de actividad.
En el siguiente ejemplo, se muestra cómo crear una secuencia con bits invertidos y una tabla en la que su columna de clave usa la secuencia como valor predeterminado:
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);
CREATE SEQUENCE SingerIdSequence bit_reversed_positive;
CREATE TABLE Singers (
SingerId bigint DEFAULT nextval('SingerIdSequence'),
Name text,
PRIMARY KEY (SingerId)
);
Luego, puedes usar la siguiente sentencia SQL para insertar y mostrar el valor de la clave primaria:
INSERT INTO Singers (Name) VALUES ('Melissa Garcia')
THEN RETURN SingerId;
INSERT INTO Singers (name) VALUES ('Melissa Garcia')
RETURNING (SingerId);
Esta sentencia muestra un resultado similar al siguiente:
SingerId |
---|
3458764513820540928 |
Situaciones en las que se usan UUIDs y secuencias como valores predeterminados para claves primarias
Las situaciones para UUIDs y secuencias incluyen las siguientes:
- Aplicaciones nuevas
- Migraciones
En las siguientes secciones, se describe cada situación.
Aplicaciones nuevas
Si tu aplicación existente requiere claves INT64
en GoogleSQL o claves bigint
en PostgreSQL, Spanner ofrece el objeto de esquema de secuencia positiva con bits invertidos (PostgreSQL o
GoogleSQL). De lo contrario, para las aplicaciones nuevas, te recomendamos que uses un identificador único universal (UUID).
Para obtener más información, consulta Usa un identificador único universal (UUID).
Migraciones
Para migrar tablas a Spanner, tienes algunas opciones:
- Si usas UUIDs en tu base de datos de origen, en Spanner, puedes usar una columna clave en el tipo
STRING
y la funciónGENERATE_UUID()
(GoogleSQL o PostgreSQL) como su valor predeterminado. - Si usas una clave primaria de número entero y tu aplicación solo necesita que la clave sea única, puedes usar una columna de clave en
INT64
y una secuencia positiva con bits invertidos para el valor predeterminado de la clave primaria. Consulta Cómo migrar columnas de claves con bits invertidos. Spanner no admite una forma de generar valores monotónicos.
Si usas una clave monótona, como el tipo
SERIAL
de PostgreSQL o el atributoAUTO_INCREMENT
de MySQL, y necesitas claves monótonas nuevas en Spanner, puedes usar una clave compuesta. Para obtener más información, consulta Cómo intercambiar el orden de las claves y Cómo generar un hash de la clave única y distribuir las escrituras en fragmentos lógicos.Si tu aplicación invierte manualmente los bits de la clave
INT64
en GoogleSQL o la clavebigint
en PostgreSQL, puedes usar una secuencia positiva con inversión de bits (GoogleSQL o PostgreSQL) y hacer que genere valores de clave nuevos. Para obtener más información, consulta Cómo migrar columnas de claves con bits invertidos.
¿Qué sigue?
- Obtén más información para usar secuencias con control de acceso detallado.
- Obtén información sobre las sentencias
SEQUENCE
de DDL para GoogleSQL o PostgreSQL. - Obtén información sobre las funciones de secuencia en GoogleSQL o PostgreSQL.
- Obtén información sobre las secuencias en INFORMATION_SCHEMA en GoogleSQL o PostgreSQL.
- Obtén información sobre las opciones de secuencia en INFORMATION_SCHEMA para GoogleSQL.