Auf dieser Seite werden Strategien zur Generierung von Primärschlüsselwerten in Ihrem mit Standardwertausdrücken. Diese Strategien haben Folgendes: Vorteile:
- Heißlaufen verhindern
- Migrationen aus anderen Datenbanken vereinfachen
- Kapseln Sie die Schlüssellogik in der Datenbank, sodass Sie sich über die Verwaltung in Ihrer Anwendung
Sie können die folgenden Strategien in einer Spalte mit DEFAULT
-Ausdrücken verwenden:
- Eine UUID-Funktion, die UUID-Version 4-Werte generiert.
- Das Schemaobjekt
SEQUENCE
mit einembit_reversed_positive
Option.SEQUENCE
ist sowohl für GoogleSQL als auch für PostgreSQL verfügbar.
Methoden zum automatischen Generieren von Primärschlüsseln
Universally Unique Identifier (UUID)
Spanner kann automatisch einen UUID-String der Version 4 generieren die Sie als Primärschlüssel verwenden können. UUIDs funktionieren gut für neue Anwendungen und Tabellen mit viele Zeilen. Sie sind grob gleichmäßig über den Schlüsselbereich verteilt, verhindert Heißlaufen in großem Maßstab. UUID Generation kann eine große Anzahl von Werten erzeugen (2122) und jeder Wert effektiv einzigartig ist. Zum Beispiel benötigen Sie 2, 71 × 1018 Werte für eine 50-prozentige Kollisionswahrscheinlichkeit oder 1 Milliarde pro Sekunde über einen Zeitraum von 86 Jahren. Dadurch werden eindeutige Werte sichergestellt, wenn Sie großen Tabellen erstellen. UUIDs sind eindeutig, unabhängig davon, ob Sie sie in der Datenbank oder im Client. Wir empfehlen, nach Möglichkeit UUIDs zu verwenden. Sie können bedenkenlos vom Client und Spanner generierten UUIDs in derselben Tabelle, Client-generierte UUIDs werden in Kleinbuchstaben serialisiert, RFC 4122.
Für eine Spalte, die Standardwerte benötigt, können Sie den GENERATE_UUID
verwenden.
um sie zu generieren. Das folgende Beispiel zeigt, wie Sie
eine Tabelle, in der die Schlüsselspalte FanId
GENERATE_UUID
im Wert enthält
-Spalte als Standardwert ein. Im Beispiel werden 36 Zeichen für die GoogleSQL-
STRING
- und PostgreSQL-varchar
-Attribute, da UUIDs 36 Zeichen haben.
Wenn Sie die Anweisung INSERT with THEN RETURN
zum Einfügen in die
Fans
generiert, generiert GENERATE_UUID
einen UUID-Wert für FanId
und gibt diesen zurück.
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);
Diese Anweisung gibt ein Ergebnis wie das folgende zurück:
FanId |
---|
6af91072-f009-4c15-8c42-ebe38ae83751 |
Weitere Informationen zur Funktion GENERATE_UUID()
finden Sie unter GoogleSQL.
oder die Referenzseite für PostgreSQL.
Bitumkehrende Sequenz
Eine Bitumkehrte Sequenz ist ein Schemaobjekt, das eine Sequenz von und kehrt sie in Bit-Umkehrung um. Dieses Objekt verwendet Bit-Umkehrung auf einem privaten, internen Spanner-Zähler, um die Eindeutigkeit sicherzustellen. Das Ergebnis Bitumkehrte Werte verhindert Heißlaufen in großem Maßstab, wenn sie in einem Primärschlüssel verwendet wird.
In Spanner verwenden Sie SEQUENCE
-DDL-Anweisungen zusammen mit den
bit_reversed_positive
-Attribut zum Erstellen, Ändern oder Löschen eines
Sequenz, die bitumgekehrte positive Werte erzeugt (GoogleSQL oder
PostgreSQL).
In jeder Sequenz werden eine Reihe interner Zähler verwaltet und zur Erstellung eines Wert. Der Sequenzzähler liefert die Eingabe für den Bitumkehr-Algorithmus.
Wenn Sie eine Spalte mit einem DEFAULT
-Ausdruck definieren, der die GoogleSQL-
GET-NEXT-SEQUENCE-VALUE
oder die
PostgreSQL-Funktion nextval
als Standardwert, Spanner
ruft automatisch die Funktion auf
und fügt die bitumkehrenden Ausgabewerte
in der Spalte. Bitumkehrende Sequenzen sind
besonders nützlich für Primärschlüssel,
weil Bitumkehrwerte gleichmäßig über den Schlüssel verteilt sind
damit sie nicht zu einem Heißlaufen führen.
Das folgende Beispiel zeigt, wie Sie eine bitumkehrende Sequenz und eine Tabelle erstellen wobei die Schlüsselspalte die Sequenz als Standardwert verwendet:
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)
);
Sie können dann die folgende SQL-Anweisung verwenden, um die primäre Schlüsselwert:
GoogleSQL
INSERT INTO Singers (Name) VALUES ('Melissa Garcia')
THEN RETURN SingerId;
PostgreSQL
INSERT INTO Singers (name) VALUES ('Melissa Garcia')
RETURNING (SingerId);
Diese Anweisung gibt ein Ergebnis wie das folgende zurück:
SingerId |
---|
3458764513820540928 |
Szenarien für die Verwendung von UUIDs und Sequenzen als Standardwerte für Primärschlüssel
Die Szenarien für UUIDs und Sequenzen umfassen Folgendes:
- Neue Anwendungen
- Migrationen
In den folgenden Abschnitten werden die einzelnen Szenarien beschrieben.
Neue Anwendungen
Wenn für Ihre vorhandene Anwendung INT64
-Schlüssel in GoogleSQL oder bigint
erforderlich sind
in PostgreSQL verwendet, bietet Spanner die Bitumkehrung
Sequenzschemaobjekts (PostgreSQL oder GoogleSQL) angegeben werden. Andernfalls
empfehlen wir die Verwendung von
Universally Unique Identifier (UUID): Für
Weitere Informationen finden Sie unter Verwenden einer UUID (Universally Unique Identifier).
Migrationen
Bei der Migration von Tabellen zu Spanner haben Sie mehrere Möglichkeiten:
- Wenn Sie in der Quelldatenbank UUIDs verwenden,
können Sie eine Schlüsselspalte im Typ
STRING
und imGENERATE_UUID()
verwenden. (GoogleSQL oder PostgreSQL) als Standardwert festzulegen. - Wenn Sie einen ganzzahligen Primärschlüssel verwenden und Ihre Anwendung nur den
eindeutig sein muss, können Sie eine Schlüsselspalte in
INT64
und positive Sequenz für den Standardwert für den Primärschlüssel. Weitere Informationen finden Sie unter Bitumkehrte Schlüsselspalten migrieren. Spanner unterstützt keine Möglichkeit zum Generieren monotoner Werte.
Wenn Sie einen monotonen Schlüssel wie den PostgreSQL-Typ
SERIAL
oder MySQL-AttributAUTO_INCREMENT
und Sie benötigen neue monotone Schlüssel für Spanner können Sie einen zusammengesetzten Schlüssel verwenden. Weitere Informationen finden Sie unter Vertauschen Sie die Reihenfolge der Schlüssel und Hashen Sie den eindeutigen Schlüssel und verteilen Sie die Schreibvorgänge auf logische Shards.Wenn Ihre Anwendung Ihren
INT64
-Schlüssel in GoogleSQL manuell Bitumkehrt oderbigint
-Schlüssel in PostgreSQL haben, können Sie eine bit umgekehrte positive Sequenz verwenden. (GoogleSQL oder PostgreSQL) und lassen Sie neue Schlüssel/Wert-Paare für von dir. Weitere Informationen finden Sie unter Bitumkehrte Schlüsselspalten migrieren.
Nächste Schritte
- Weitere Informationen zur Verwendung von Sequenzen mit detaillierter Zugriffssteuerung
- Informationen zu DDL-
SEQUENCE
-Anweisungen für GoogleSQL oder PostgreSQL - Informationen zu Sequenzfunktionen in GoogleSQL oder PostgreSQL
- Mehr über Sequenzen im INFORMATION_SCHEMA in GoogleSQL erfahren oder PostgreSQL.
- Informationen zu Sequenzoptionen im INFORMATION_SCHEMA für GoogleSQL.