Auf dieser Seite werden Strategien zum Generieren von Primärschlüsselwerten in Ihrer Tabelle mithilfe von Standardwertausdrücken erläutert. Diese Strategien haben folgende Vorteile:
- Heißlaufen verhindern
- Migrationen aus anderen Datenbanken vereinfachen
- Kapseln der Schlüssellogik in der Datenbank, sodass Sie sich nicht um deren 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, um ihn als Primärschlüssel zu verwenden. UUIDs funktionieren gut für neue Anwendungen und Tabellen mit vielen Zeilen. Sie sind grob gleichmäßig über den Schlüsselbereich verteilt, was ein Heißlaufen in großem Maßstab verhindert. Die UUID-Generierung kann eine große Anzahl von Werten (2122) erzeugen, wobei jeder Wert effektiv eindeutig ist. Beispiel: Sie benötigen Werte von 2,71 × 1018 für eine 50-prozentige Kollisionswahrscheinlichkeit oder 1 Milliarde pro Sekunde für 86 Jahre. Dadurch werden eindeutige Werte sichergestellt, wenn Sie sie in großen Tabellen verwenden. UUIDs sind eindeutig, unabhängig davon, ob sie in der Datenbank oder im Client generiert werden. Wir empfehlen, nach Möglichkeit UUIDs zu verwenden. Sie können vom Client und Spanner generierte UUIDs sicher in derselben Tabelle mischen, wenn diese gemäß RFC 4122 in Kleinbuchstaben serialisiert werden.
Spalten, die Standardwerte benötigen, können Sie mit der Funktion GENERATE_UUID
generieren. Das folgende Beispiel zeigt, wie Sie eine Tabelle erstellen, bei der für die Schlüsselspalte FanId
in der Wertspalte GENERATE_UUID
als Standardwert festgelegt ist. Im 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 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 auf der Referenzseite zu GoogleSQL oder PostgreSQL.
Bitumkehrende Sequenz
Eine Bit-umgekehrte Sequenz ist ein Schemaobjekt, das eine Sequenz von Ganzzahlen erzeugt und sie Bit-Umkehrungen durchführt. Dieses Objekt verwendet Bitumkehr für einen privaten, internen Spanner-Zähler, um die Eindeutigkeit sicherzustellen. Die resultierenden bit-umgekehrten Werte tragen dazu bei, bei Verwendung in einem Primärschlüssel ein Heißlaufen in großem Maßstab zu vermeiden.
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 bitumgekehrte positive Werte erzeugt (GoogleSQL oder PostgreSQL).
In jeder Sequenz werden eine Reihe interner Zähler verwaltet und zum Generieren eines Werts verwendet. Der Sequenzzähler liefert die Eingabe für den Bitumkehr-Algorithmus.
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. Bitumkehrte Sequenzen sind besonders nützlich für Primärschlüssel, da Bitumkehrwerte gleichmäßig über den Schlüsselbereich verteilt sind, sodass sie kein Heißlaufen verursachen.
Das folgende Beispiel zeigt, wie Sie eine bitumgekehrte 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 den Wert des Primärschlüssels 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 Folgendes:
- Neue Anwendungen
- Migrationen
In den folgenden Abschnitten werden die einzelnen Szenarien beschrieben.
Neue Anwendungen
Wenn für die vorhandene Anwendung INT64
-Schlüssel in GoogleSQL oder bigint
-Schlüssel in PostgreSQL erforderlich sind, bietet Spanner das bitumgekehrte positive Sequenzschemaobjekt (PostgreSQL oder GoogleSQL). Andernfalls empfehlen wir für neue Anwendungen die Verwendung der Universally Unique Identifier (UUID). Weitere Informationen finden Sie unter 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 in Spanner 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 in Ihrer Anwendung nur ein eindeutiger Schlüssel benötigt wird, können Sie eine Schlüsselspalte in
INT64
verwenden und für den Standardwert für den Primärschlüssel eine Bit-umgekehrte positive Sequenz verwenden. Siehe Bitumkehrte Schlüsselspalten migrieren. Spanner unterstützt keine Möglichkeit zum Generieren monotoner Werte.
Wenn Sie einen monotonen Schlüssel wie den
SERIAL
-Typ von PostgreSQL oder das MySQL-AttributAUTO_INCREMENT
verwenden und neue monotone Schlüssel in Spanner benötigen, können Sie einen zusammengesetzten Schlüssel verwenden. Weitere Informationen finden Sie unter Reihenfolge der Schlüssel tauschen und Eindeutigen Schlüssel hashen und Schreibvorgänge auf logische Shards verteilen.Wenn Ihre Anwendung Ihren
INT64
-Schlüssel in GoogleSQL oder Ihrenbigint
-Schlüssel in PostgreSQL manuell Bitumkehrt, können Sie eine bitumgekehrte positive Sequenz (GoogleSQL oder PostgreSQL) verwenden und neue Schlüsselwerte für Sie generieren lassen. Siehe 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 oder PostgreSQL erfahren
- Sequenzoptionen im INFORMATION_SCHEMA für GoogleSQL