Auf dieser Seite werden Strategien zum Generieren von Primärschlüsselwerten in Ihrer Tabelle mithilfe von Standardwertausdrücken beschrieben. Die Informationen auf dieser Seite gelten sowohl für Datenbanken mit GoogleSQL-Dialekt als auch für Datenbanken mit PostgreSQL-Dialekt. Diese Strategien bieten folgende Vorteile:
- Hotspots vermeiden
- Migrationen von anderen Datenbanken vereinfachen
- Kapseln Sie die Schlüssellogik in der Datenbank, damit Sie sich nicht um die Verwaltung in Ihrer Anwendung kümmern müssen.
- In den meisten Fällen müssen Sie keine eigenen Sequenzen mehr erstellen und verwalten.
Methoden zum automatischen Generieren von Primärschlüsseln
Wenn Sie Primärschlüsselwerte automatisch generieren möchten, können Sie die folgenden Strategien in einer Spalte mit DEFAULT-Ausdrücken verwenden:
- Eine UUID-Funktion, die UUID-Werte der Version 4 generiert.
IDENTITY-Spalten, in denen automatisch Ganzzahlwerte für Schlüssel- und Nicht-Schlüsselspalten generiert werden.SERIALin PostgreSQL undAUTO_INCREMENTin GoogleSQL, die DDL-Aliase fürIDENTITY-Spalten sind.- Ein Schema-Objekt,
SEQUENCE, mit der Optionbit_reversed_positive.SEQUENCEist sowohl für GoogleSQL als auch für PostgreSQL verfügbar.
Universally Unique Identifier (UUID)
Spanner kann automatisch einen UUID-String der Version 4 generieren, der als Primärschlüssel verwendet werden kann. UUIDs eignen sich gut für neue Anwendungen und Tabellen mit vielen Zeilen. Sie sind ungefähr gleichmäßig über den Schlüsselbereich verteilt, was Hotspots im großen Maßstab verhindert. Bei der UUID-Generierung können eine große Anzahl von Werten (2122) erstellt werden, die jeweils eindeutig sind. Für eine Kollisionswahrscheinlichkeit von 50% wären beispielsweise 2, 71 × 1018 Werte erforderlich, also 1 Milliarde pro Sekunde über 86 Jahre hinweg. So werden eindeutige Werte sichergestellt, wenn Sie die Funktion in großen Tabellen verwenden. UUIDs sind eindeutig, unabhängig davon, ob Sie sie in der Datenbank oder auf dem Client generieren. Wir empfehlen, nach Möglichkeit UUIDs zu verwenden. Sie können client- und Spanner-generierte UUIDs in derselben Tabelle kombinieren, wenn die clientgenerierten UUIDs gemäß RFC 4122 als Kleinbuchstaben serialisiert werden.
Für eine Spalte, die Standardwerte benötigt, können Sie die Funktion GENERATE_UUID verwenden, um sie zu generieren. Im folgenden Beispiel wird gezeigt, wie Sie eine Tabelle erstellen, in der die Schlüsselspalte FanId den Standardwert GENERATE_UUID in der Wertspalte hat.
Im Beispiel werden 36 Zeichen für die GoogleSQL-Attribute STRING und PostgreSQL-Attribute varchar verwendet, 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 ähnlich dem folgenden zurück:
| FanId |
|---|
| 6af91072-f009-4c15-8c42-ebe38ae83751 |
Weitere Informationen zur Funktion GENERATE_UUID() finden Sie auf der Referenzseite zu GoogleSQL oder PostgreSQL.
IDENTITY Spalten
Mit IDENTITY-Spalten können Sie automatisch Ganzzahlwerte für Schlüssel- und Nicht-Schlüsselspalten generieren. Für IDENTITY-Spalten müssen Nutzer keine zugrunde liegende Sequenz manuell verwalten oder die Beziehung zwischen der Spalte und der zugrunde liegenden Sequenz verwalten. Wenn eine automatisch generierte Identitätsspalte gelöscht wird, wird auch die zugrunde liegende Sequenz automatisch gelöscht.
Sie können IDENTITY-Spalten verwenden, indem Sie entweder beim Generieren der Sequenz einen Startganzzahlwert angeben oder die Ganzzahlsequenz von Spanner generieren lassen. Wenn Sie einen Startwert für die Ganzzahl angeben möchten, müssen Sie die Option START COUNTER WITH und einen positiven INT64-Startwert verwenden.
Spanner verwendet diesen Wert, um den nächsten Wert für den automatisch generierten internen Sequenzzähler festzulegen, und kehrt die Bits des Werts um, bevor er in diese Spalte eingefügt wird.
In Spanner werden IDENTITY-Spalten sowohl in GoogleSQL als auch in PostgreSQL unterstützt.
GoogleSQL
Im folgenden Beispiel wird gezeigt, wie Sie IDENTITY-Spalten verwenden, um beim Erstellen einer neuen Tabelle mit dem Befehl CREATE TABLE eine automatisch generierte primäre Spalte mit Ganzzahl-ID für SingerId zu erstellen:
CREATE TABLE Singers (
SingerId INT64 GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
Name STRING(MAX),
Rank INT64
) PRIMARY KEY (SingerId);
Sie können den Zählerstart für die Spalte auch mit der Option START_WITH_COUNTER angeben. Im folgenden Beispiel wird eine automatisch generierte Ganzzahlspalte für SingerId erstellt, die bitweise umgekehrte positive Werte und einen internen Zähler hat,der bei 1.000 beginnt.
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);
PostgreSQL
Im folgenden Beispiel wird gezeigt, wie Sie IDENTITY-Spalten verwenden, um beim Erstellen einer neuen Tabelle mit dem Befehl CREATE
TABLE eine automatisch generierte Ganzzahlspalte für SingerId zu erstellen:
CREATE TABLE Singers (
SingerId bigint GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
Name text,
PRIMARY KEY (SingerId)
);
Sie können den Zählerstart für die Spalte auch mit der Option START COUNTER WITH angeben. Im folgenden Beispiel wird eine automatisch generierte Ganzzahlspalte für SingerId erstellt, in der bitweise umgekehrte positive Werte generiert werden. Der interne Zähler beginnt vor der Bitumkehrung bei 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 und AUTO_INCREMENT
Spanner unterstützt SERIAL in PostgreSQL und AUTO_INCREMENT in GoogleSQL. Das sind DDL-Aliase für IDENTITY-Spalten, die zum Erstellen eindeutiger Ganzzahlspalten verwendet werden. Sie müssen zuerst die Datenbankoption default_sequence_kind festlegen, bevor Sie SERIAL oder AUTO_INCREMENT verwenden können.
Mit der folgenden SQL-Anweisung können Sie die Datenbankoption default_squence_kind festlegen:
GoogleSQL
ALTER DATABASE db SET OPTIONS (default_sequence_kind = 'bit_reversed_positive');
CREATE TABLE Singers (
id INT64 AUTO_INCREMENT PRIMARY KEY,
name STRING(MAX),
)
PostgreSQL
ALTER DATABASE db SET spanner.default_sequence_kind = 'bit_reversed_positive';
CREATE TABLE Singers (
id serial PRIMARY KEY,
name text
);
Da SERIAL und AUTO_INCREMENT IDENTITY-Spalten zugeordnet sind, werden sie beim Serialisieren des Schemas nicht angezeigt. Für dieses Schema wäre die Ausgabe von GetDatabaseDDL:
GoogleSQL
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);
PostgreSQL
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)
);
Bit-umgekehrte Sequenz
Eine bit-reversed sequence (bitweise umgekehrte Sequenz) ist ein Schemaobjekt, das eine Sequenz von Ganzzahlen erzeugt und die Bits umkehrt. Für dieses Objekt wird die Bitumkehrung für einen privaten, internen Spanner-Zähler verwendet, um die Eindeutigkeit zu gewährleisten. Die resultierenden bitumgekehrten Werte helfen, Hotspots zu vermeiden, wenn sie in einem Primärschlüssel verwendet werden.
In Spanner verwenden Sie SEQUENCE-DDL-Anweisungen 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).
Für jede Sequenz wird eine Reihe interner Zähler verwaltet, die zum Generieren eines Werts verwendet werden. Der Sequenzzähler liefert die Eingabe für den Bit-Umkehr-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 bitweise umgekehrten Ausgabewerte in die Spalte ein. Bit-Umkehrungen sind besonders nützlich für Primärschlüssel, da bit-umgekehrte Werte gleichmäßig über den Schlüsselbereich verteilt sind und daher keine Hotspots verursachen.
Im folgenden Beispiel wird gezeigt, wie eine bitumgekehrte Sequenz und eine Tabelle erstellt werden, in der 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)
);
Mit der folgenden SQL-Anweisung können Sie den Primärschlüsselwert einfügen und zurückgeben:
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 ähnlich dem folgenden 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-Schlüssel in PostgreSQL erforderlich sind, bietet Spanner das Schemaobjekt für die bitumgekehrte positive Sequenz (PostgreSQL oder
GoogleSQL). Andernfalls empfehlen wir für neue Anwendungen die Verwendung von Universally Unique Identifier (UUID).
Weitere Informationen finden Sie unter Universally Unique Identifier verwenden.
Migrationen
Für die Migration von Tabellen zu Spanner haben Sie mehrere Optionen:
- Wenn Sie UUIDs in Ihrer Quelldatenbank verwenden, können Sie in Spanner eine Schlüsselspalte vom Typ
STRINGund die FunktionGENERATE_UUID()(GoogleSQL oder PostgreSQL) als Standardwert verwenden. - Wenn Sie einen primären Ganzzahlschlüssel verwenden und Ihre Anwendung nur einen eindeutigen Schlüssel benötigt, können Sie eine Schlüsselspalte in
INT64verwenden und eine bitumgekehrte positive Sequenz als Standardwert für den Primärschlüssel festlegen. Weitere Informationen finden Sie unter Bit-reversed-Schlüsselspalten migrieren. Spanner unterstützt keine Möglichkeit zum Generieren monotoner Werte.
Wenn Sie einen monotonen Schlüssel wie den PostgreSQL-Typ
SERIALoder das MySQL-AttributAUTO_INCREMENTverwenden 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 aufteilen.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, um neue Schlüsselwerte zu generieren. Weitere Informationen finden Sie unter Bit-reversed-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 - GoogleSQL oder PostgreSQL
- Informationen zu Sequenzen in INFORMATION_SCHEMA finden Sie unter GoogleSQL oder PostgreSQL.
- Sequenzoptionen in INFORMATION_SCHEMA für GoogleSQL