In diesem Artikel wird detailliert beschrieben, wie Sie Teilsequenzen in PostgreSQL mithilfe von Sequenzen und Triggern generieren. Das Szenario umfasst eine Tabelle mit einem zusammengesetzten Primärschlüssel (id, seq), der eine benutzerdefinierte Lösung erfordert, um für jeden id
.
Die Lösung besteht darin, zwei Tabellen zu erstellen und Trigger zu implementieren:
Tabellenstruktur:
id
als Primärschlüssel.id
(Fremdschlüsselreferenzierung things
), seq
(die Teilsequenznummer) und notes
enthalten. Der Primärschlüssel ist die Kombination aus id
und seq
.Auslöser und Funktionen:
things
Tabellentrigger (make_thing_seq
): Dieser Trigger wird nach jeder Einfügung in die things
-Tabelle ausgeführt. Es erstellt eine neue Sequenz mit dem Namen thing_seq_{id}
für jedes neue id
.
stuff
Tabellentrigger (fill_in_stuff_seq
): Dieser Trigger wird vor jeder Einfügung in die stuff
-Tabelle ausgeführt. Es ruft den nächsten Wert aus der entsprechenden Sequenz (thing_seq_{id}
) basierend auf dem eingefügten id
ab und weist ihn der Spalte seq
zu.
Beispielimplementierung:
Der folgende Code demonstriert die Tabellenerstellung und Triggerimplementierung:
<code class="language-sql">-- Create the tables CREATE TABLE things ( id serial primary key, name text ); CREATE TABLE stuff ( id integer references things, seq integer NOT NULL, notes text, primary key (id, seq) ); -- Trigger in things table to create new sequences CREATE OR REPLACE FUNCTION make_thing_seq() RETURNS trigger LANGUAGE plpgsql AS $$ begin EXECUTE format('CREATE SEQUENCE IF NOT EXISTS thing_seq_%s', NEW.id); -- Added IF NOT EXISTS RETURN NEW; end; $$; CREATE TRIGGER make_thing_seq AFTER INSERT ON things FOR EACH ROW EXECUTE PROCEDURE make_thing_seq(); -- Trigger in stuff table to use correct sequence CREATE OR REPLACE FUNCTION fill_in_stuff_seq() RETURNS trigger LANGUAGE plpgsql AS $$ begin NEW.seq := nextval(format('thing_seq_%s', NEW.id)); RETURN NEW; end; $$; CREATE TRIGGER fill_in_stuff_seq BEFORE INSERT ON stuff FOR EACH ROW EXECUTE PROCEDURE fill_in_stuff_seq();</code>
Dieses Setup stellt sicher, dass durch das Einfügen von Daten in things
und stuff
automatisch eindeutige Teilsequenzen für jedes id
generiert werden, wodurch die Integrität des zusammengesetzten Primärschlüssels gewahrt bleibt. Die IF NOT EXISTS
-Klausel wurde zur Funktion make_thing_seq
hinzugefügt, um Fehler zu verhindern, wenn eine Sequenz für eine bestimmte ID bereits vorhanden ist.
Das obige ist der detaillierte Inhalt vonWie generiert man Untersequenzen in PostgreSQL mithilfe von Sequenzen und Triggern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!