Auf dieser Seite werden Strategien zum Generieren von Primärschlüsselwerten in Ihrer Tabelle mithilfe von Standardwertausdrücken erläutert. Diese Strategien bieten folgende Vorteile:
- Heißlaufen verhindern
- Migrationen aus anderen Datenbanken vereinfachen
- Die Schlüssellogik in die Datenbank kapseln, sodass Sie sich nicht um die Verwaltung in Ihrer Anwendung kümmern müssen
Sie können die folgenden Strategien in einer Spalte mit DEFAULT
-Ausdrücken verwenden:
- Eine UUID-Funktion, die UUID Version 4-Werte generiert.
- Ein Schemaobjekt (
SEQUENCE
) mit der Optionbit_reversed_positive
.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, der als Primärschlüssel verwendet wird. UUIDs eignen sich gut für neue Anwendungen und Tabellen mit vielen Zeilen. Sie sind ungefähr gleichmäßig über den Schlüsselbereich verteilt, wodurch ein Heißlaufen im großen Maßstab vermieden wird. Die UUID-Generierung kann eine große Anzahl von Werten (2122) erzeugen und jeder Wert ist praktisch eindeutig. Sie benötigen beispielsweise Werte von 2,71 × 1018 für eine 50% ige Kollisionswahrscheinlichkeit oder 1 Milliarde pro Sekunde für 86 Jahre. Dadurch erhalten Sie eindeutige Werte, wenn Sie es in großen Tabellen verwenden. UUIDs sind eindeutig, unabhängig davon, ob Sie sie in der Datenbank oder im Client generieren. Wir empfehlen, nach Möglichkeit UUIDs zu verwenden. Sie können vom Client und von Spanner generierte UUIDs bedenkenlos in derselben Tabelle mischen, wenn die vom Client generierten UUIDs gemäß RFC 4122 als Kleinschreibung serialisiert sind.
Für eine Spalte, die Standardwerte benötigt, können Sie diese mit der Funktion GENERATE_UUID
generieren. Das folgende Beispiel zeigt, wie Sie eine Tabelle erstellen, in der in der Schlüsselspalte FanId
GENERATE_UUID
in der Wertspalte als Standardwert steht. In diesem Beispiel werden für die GoogleSQL-Attribute STRING
und PostgreSQL varchar
36 Zeichen verwendet, da UUIDs 36 Zeichen haben.
Wenn Sie die Anweisung INSERT with THEN RETURN
zum Einfügen in die Tabelle Fans
verwenden, generiert GENERATE_UUID
einen UUID-Wert für FanId
und gibt ihn 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 auf der Referenzseite zu GoogleSQL oder PostgreSQL.
Bit-Umkehrung
Eine Bit-umgekehrte Sequenz ist ein Schemaobjekt, das eine Folge von Ganzzahlen erzeugt und Bit-Umkehrungen zu ihnen durchführt. Dieses Objekt verwendet die Bit-Umkehrung für einen privaten, internen Spanner-Zähler, um Eindeutigkeit sicherzustellen. Die resultierenden bit-umgekehrten Werte tragen dazu bei, ein Heißlaufen in großem Maßstab zu vermeiden, wenn sie in einem Primärschlüssel verwendet werden.
In Spanner verwenden Sie DDL-Anweisungen vom Typ SEQUENCE
zusammen mit dem Attribut bit_reversed_positive
, um eine Sequenz zu erstellen, zu ändern oder zu löschen, die Bit-Umkehrungen für positive Werte erzeugt (GoogleSQL oder PostgreSQL).
Jede Sequenz verwaltet eine Reihe interner Zähler, die zum Generieren eines Werts verwendet werden. Der Sequenzzähler liefert die Eingabe für den Bitumkehralgorithmus.
Wenn Sie eine Spalte mit einem DEFAULT
-Ausdruck definieren, der die GoogleSQL-Funktion GET-NEXT-SEQUENCE-VALUE
oder die PostgreSQL-Funktion nextval
als Standardwert verwendet, ruft Spanner die Funktion automatisch auf und fügt die Bit-umgekehrten Ausgabewerte in die Spalte ein. Bit-umgekehrte Sequenzen sind besonders nützlich für Primärschlüssel, da Bit-umgekehrte Werte gleichmäßig über den Schlüsselbereich verteilt sind, sodass sie kein Heißlaufen verursachen.
Das folgende Beispiel zeigt, wie Sie eine Bit-umgekehrte Sequenz und eine Tabelle erstellen, in deren Schlüsselspalte die Sequenz als Standardwert verwendet wird:
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 den Primärschlüsselwert einzufügen und zurückzugeben:
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:
- Neue Anwendungen
- Migrationen
In den folgenden Abschnitten wird jedes Szenario beschrieben.
Neue Anwendungen
Wenn für Ihre vorhandene Anwendung INT64
-Schlüssel in GoogleSQL oder bigint
-Schlüssel in PostgreSQL erforderlich sind, bietet Spanner das Bit-Umgekehrte Schemaobjekt für positive Sequenzen (PostgreSQL oder GoogleSQL). Andernfalls empfehlen wir für neue Anwendungen die Verwendung der UUID (Universally Unique Identifier). Weitere Informationen finden Sie unter Universally Unique Identifier (UUID) verwenden.
Migrationen
Bei der Migration von Tabellen zu Spanner haben Sie mehrere Möglichkeiten:
- Wenn Sie in Ihrer Quelldatenbank in Spanner UUIDs verwenden, können Sie eine Schlüsselspalte im Typ
STRING
und die FunktionGENERATE_UUID()
(GoogleSQL oder PostgreSQL) als Standardwert verwenden. - Wenn Sie einen ganzzahligen Primärschlüssel verwenden und die Anwendung nur einen eindeutigen Schlüssel benötigt, können Sie eine Schlüsselspalte in
INT64
verwenden und eine bitumgekehrte positive Sequenz als Standardwert für den Primärschlüssel verwenden. Weitere Informationen finden Sie unter Umgekehrte Schlüsselspalten migrieren. Spanner unterstützt keine Möglichkeit, monotone Werte zu generieren.
Wenn Sie einen monotonen Schlüssel wie den PostgreSQL-Typ
SERIAL
oder das MySQL-AUTO_INCREMENT
-Attribut verwenden und neue monotone Schlüssel für Spanner benötigen, können Sie einen zusammengesetzten Schlüssel verwenden. Weitere Informationen finden Sie unter Reihenfolge von Schlüsseln ändern und Hashen Sie den eindeutigen Schlüssel und verteilen Sie die Schreibvorgänge auf logische Shards.Wenn Ihre Anwendung den
INT64
-Schlüssel in GoogleSQL oder denbigint
-Schlüssel in PostgreSQL manuell umkehrt, können Sie eine umgekehrte positive Abfolge (GoogleSQL oder PostgreSQL) verwenden und neue Schlüssel/Wert-Paare generieren lassen. Weitere Informationen finden Sie unter Umgekehrte Schlüsselspalten migrieren.
Nächste Schritte
- Weitere Informationen zur Verwendung von Sequenzen mit detaillierter Zugriffssteuerung
- Weitere Informationen zu DDL-
SEQUENCE
-Anweisungen für GoogleSQL oder PostgreSQL - Sequenzfunktionen in GoogleSQL oder PostgreSQL
- Informationen zu Sequenzen im INFORMATION_SCHEMA in GoogleSQL oder PostgreSQL
- Informationen zu Sequenzoptionen im INFORMATION_SCHEMA für GoogleSQL