Heim > Datenbank > MySQL-Tutorial > Wie erstelle ich eine PostgreSQL-Sequenz, die von einer anderen Spalte abhängig ist?

Wie erstelle ich eine PostgreSQL-Sequenz, die von einer anderen Spalte abhängig ist?

Mary-Kate Olsen
Freigeben: 2025-01-24 05:58:13
Original
463 Leute haben es durchsucht

How to Create a PostgreSQL Sequence Dependent on Another Column?

PostgreSQL: Hilfssequenz basierend auf einer anderen Spalte erstellen

In PostgreSQL können Sie eine Sequenz erstellen, die von einer anderen Spalte abhängt, sodass Sie Sequenznummern innerhalb einer Untergruppe einer Tabelle generieren können.

Betrachten Sie das folgende Formular:

<code class="language-sql">CREATE TABLE stuff (
    id integer PRIMARY KEY,
    seq integer NOT NULL,
    data text
);</code>
Nach dem Login kopieren

Sie möchten, dass jede Kombination aus ID und Seq eindeutig ist, ähnlich dem folgenden Beispiel:

<code>ID  | SEQ   | DATA
----+------ +-------------------
 1  | 1     | Quick brown fox...
 1  | 2     | Quick brown fox...
 1  | 3     | Quick brown fox...
 2  | 1     | Quick brown fox...
 3  | 1     | Quick brown fox...</code>
Nach dem Login kopieren

Hilfstabellen und Trigger erstellen

Dazu müssen Sie zwei Tabellen und einen Trigger erstellen:

<code class="language-sql">CREATE TABLE things (
    id SERIAL PRIMARY KEY,
    name text
);

CREATE TRIGGER make_thing_seq AFTER INSERT ON things FOR EACH ROW
    EXECUTE PROCEDURE nextval('things_id_seq');

CREATE SEQUENCE things_id_seq;</code>
Nach dem Login kopieren
Die

things-Tabelle ist die übergeordnete Tabelle, die die id-Spalten enthält. Der make_thing_seq-Trigger erstellt automatisch eine neue Sequenz mit dem Namen things für jede Zeile, die in die thing_seq_<thing_id>-Tabelle eingefügt wird.

Füllen Sie die Stuff-Sequenz aus

Jetzt müssen Sie einen zweiten Trigger erstellen, um die Spalte stuff in der Tabelle seq zu füllen:

<code class="language-sql">CREATE FUNCTION fill_in_stuff_seq() RETURNS trigger AS $$
BEGIN
  NEW.seq := nextval('thing_seq_' || NEW.id);
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER fill_in_stuff_seq BEFORE INSERT ON stuff FOR EACH ROW
    EXECUTE PROCEDURE fill_in_stuff_seq();</code>
Nach dem Login kopieren

Dieser Trigger stellt sicher, dass beim Einfügen einer neuen Zeile in die Tabelle stuff die entsprechende Sequenz (basierend auf der Spalte id) abgerufen und der Spalte seq der nächste Wert zugewiesen wird. Beachten Sie, dass die LANGUAGE plpgsql-Anweisung hier hinzugefügt wird, um klar anzugeben, dass die Sprache der Funktion PL/pgSQL ist.

Demo

Fügen Sie einige Daten ein und überprüfen Sie die Sequenzgenerierung:

<code class="language-sql">INSERT INTO things (name) VALUES ('Joe');
INSERT INTO things (name) VALUES ('Bob');
SELECT * FROM things;

-- 检查序列表
\d+ things_id_seq

INSERT INTO stuff (id, data) VALUES (1, 'Keychain');
INSERT INTO stuff (id, data) VALUES (1, 'Pet goat');
INSERT INTO stuff (id, data) VALUES (2, 'Family photo');
INSERT INTO stuff (id, data) VALUES (1, 'Redundant lawnmower');
SELECT * FROM stuff;</code>
Nach dem Login kopieren

Das Ergebnis zeigt die automatische Zuweisung von Sequenzen basierend auf der Spalte id. Der Befehl d things_id_seq wird verwendet, um Sequenzdetails anzuzeigen.

Das obige ist der detaillierte Inhalt vonWie erstelle ich eine PostgreSQL-Sequenz, die von einer anderen Spalte abhängig ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage