Auf dieser Seite werden Strategien beschrieben, mit denen Sie Primärschlüsselwerte in Ihrer Tabelle mithilfe von Standardwertausdrücken generieren können. Diese Strategien bieten folgende Vorteile:
- Hotspot-Nutzung verhindern
- Migrationen von anderen Datenbanken vereinfachen
- Kapseln Sie die Schlüssellogik in der Datenbank ein, damit Sie sich nicht um die Verwaltung in Ihrer Anwendung kümmern müssen.
In einer Spalte mit DEFAULT
-Ausdrücken können Sie die folgenden Strategien verwenden:
- Eine UUID-Funktion, die UUID-Version 4-Werte generiert.
- Ein Schemaobjekt,
SEQUENCE
, mit einerbit_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-Version-4-String generieren, der als Primärschlüssel verwendet werden kann. 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. Für eine Kollisionswahrscheinlichkeit von 50 % wären beispielsweise 2,71 × 1018 Werte erforderlich, was einer Rate von 1 Milliarde pro Sekunde über 86 Jahre entspricht. 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 client- und Spanner-generierte UUIDs in derselben Tabelle gefahrlos mischen, wenn die clientgenerierten UUIDs gemäß RFC 4122 in Kleinbuchstaben serialisiert werden.
Wenn für eine Spalte Standardwerte erforderlich sind, können Sie sie mit der Funktion GENERATE_UUID
generieren. Im folgenden Beispiel wird eine Tabelle erstellt, in der die Schlüsselspalte FanId
den Standardwert GENERATE_UUID
in der Wertespalte hat. 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
verwenden, um Daten in die Tabelle Fans
einzufügen, generiert und gibt GENERATE_UUID
einen UUID-Wert für FanId
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 in der GoogleSQL- oder PostgreSQL-Referenz.
Bit-Reversed-Sequenz
Eine Bit-Reversed-Sequenz ist ein Schemaobjekt, das eine Sequenz von Ganzzahlen generiert und diese Bit-Reversed-codiert. 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).
Jede Sequenz verwaltet eine Reihe interner Zähler und verwendet diese, um einen Wert zu generieren. Der Sequenzzähler liefert die Eingabe für den Bitumkehralgorithmus.
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. Bit-invertierte Sequenzen sind besonders nützlich für Primärschlüssel, da sie gleichmäßig über den Schlüsselbereich verteilt sind und daher keine Hotspots verursachen.
Im folgenden Beispiel wird gezeigt, wie Sie eine bitreversierte 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 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
Zu den Szenarien für UUIDs und Sequenzen gehören:
- 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 für neue Anwendungen die Verwendung einer Universally Unique Identifier (UUID). Für
Weitere Informationen finden Sie unter Verwenden einer UUID (Universally Unique Identifier).
Migrationen
Für die 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 Primärschlüssel vom Typ „Integer“ verwenden und der Schlüssel in Ihrer Anwendung nur eindeutig sein muss, können Sie in
INT64
eine Schlüsselspalte und als Standardwert für den Primärschlüssel eine bitweise umgekehrte positive Sequenz verwenden. Siehe Bitumkehrte Schlüsselspalten migrieren. In Spanner gibt es keine Möglichkeit, monotone Werte zu generieren.
Wenn Sie einen monotonen Schlüssel wie den PostgreSQL-Typ
SERIAL
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 Vertauschen Sie die Reihenfolge der Schlüssel und Hashen Sie den eindeutigen Schlüssel und verteilen Sie die Schreibvorgänge auf logische Shards.Wenn in Ihrer Anwendung der
INT64
-Schlüssel in GoogleSQL oder derbigint
-Schlüssel in PostgreSQL manuell bitweise umgekehrt wird, können Sie eine bitweise umgekehrte positive Sequenz (GoogleSQL oder PostgreSQL) verwenden und neue Schlüsselwerte 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 erfahren oder PostgreSQL.
- Sequenzoptionen im INFORMATION_SCHEMA für GoogleSQL