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 im GoogleSQL-Dialekt als auch für Datenbanken im 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 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 eine UUID Version 4 als Primärschlüssel generieren. 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, was 1 Milliarde pro Sekunde über 86 Jahre entspricht. 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 GoogleSQL-Funktion NEW_UUID oder die PostgreSQL-Funktion gen_random_uuid() verwenden, um sie zu generieren. Im folgenden Beispiel wird gezeigt, wie Sie eine Tabelle erstellen, in der die Schlüsselspalte FanId eine generierte UUID in der Wertspalte als Standardwert hat.
GoogleSQL
CREATE TABLE Fans (
FanId UUID DEFAULT (NEW_UUID()),
Name STRING(MAX),
) PRIMARY KEY (FanId);
PostgreSQL
CREATE TABLE Fans (
FanId uuid DEFAULT gen_random_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 zu den generierten UUID-Funktionen finden Sie auf der GoogleSQL- oder PostgreSQL-Referenzseite.
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 eine 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 Cloud 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 Ganzzahlen 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)
);
Sequenz mit umgekehrten Bits
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 bitweise umgekehrten 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)
);
Anschließend können Sie mit der folgenden SQL-Anweisung 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
Für neue Anwendungen empfiehlt Spanner, Universally Unique Identifiers (UUIDs) für Primärschlüssel zu verwenden. Weitere Informationen finden Sie unter Universally Unique Identifier (UUID) verwenden.
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).
Migrationen
Für die Migration von Tabellen zu Spanner haben Sie die folgenden Optionen:
- Wenn Sie UUIDs in Ihrer Quelldatenbank verwenden, können Sie in Spanner eine Spalte vom Typ „UUID“ und die generierte UUID-Funktion (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 bietet keine Möglichkeit, monotone Werte zu generieren.
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.
- GoogleSQL