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>
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>
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>
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>
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>
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!