Benutzerdefinierte PostgreSQL-Teilsequenzgenerierung: Methode zur Teilsequenzerstellung basierend auf Fremdschlüsselwerten
In diesem Artikel wird erläutert, wie Sie benutzerdefinierte Teilsequenzen basierend auf Fremdschlüsselwerten in PostgreSQL erstellen. Die Sequenzen von PostgreSQL werden normalerweise verwendet, um eindeutige Bezeichner für Zeilen in einer Tabelle zu generieren. In einigen Fällen kann es jedoch erforderlich sein, dass die Generierung einer Sequenz vom Wert einer anderen Spalte abhängt und so eine Teilsequenz erstellt.
Das folgende Bild zeigt den Kern des Problems:
Sequenzgenerierung basierend auf benutzerdefinierter Korrelation
Beachten Sie die folgende Tabellenstruktur:
列名 | 数据类型 | 说明 |
---|---|---|
id | integer | 外键,指向另一张表 |
seq | integer | 每个id的序列号 |
data | text | 无关信息 |
Das Ziel besteht darin, ein Identifikatorsystem aufzubauen, bei dem jede eindeutige Kombination aus ID und SEQ einer Zeile in der Tabelle entspricht.
PostgreSQL erreicht dies durch eine clevere Kombination aus Tabellendesign und Triggern. Wir können zwei Tabellen erstellen: things
und stuff
, wobei things
eindeutige Bezeichner darstellt und stuff
die tatsächlichen Daten speichert, die mit jedem Bezeichner verknüpft sind.
Tabellen und Trigger erstellen
things
Die Tabelle kann eine ID als Primärschlüssel erstellen:
<code class="language-sql">CREATE TABLE things ( id serial primary key, name text );</code>
Für die stuff
-Tabelle definieren wir eine Kombination aus id und seq als Primärschlüssel:
<code class="language-sql">CREATE TABLE stuff ( id integer references things, seq integer NOT NULL, notes text, primary key (id, seq) );</code>
Als nächstes implementieren wir eine Triggerfunktion namens things
für die Tabelle make_thing_seq
. Dieser Trigger wird nach jeder Zeileneinfügung aufgerufen und erstellt eine neue Sequenz mit der eingefügten ID.
<code class="language-sql">CREATE FUNCTION make_thing_seq() RETURNS trigger LANGUAGE plpgsql AS $$ begin execute format('create sequence thing_seq_%s', NEW.id); return NEW; end $$;</code>
Dann erstellen wir einen Trigger mit dem Namen things
in der Tabelle make_thing_seq
:
<code class="language-sql">CREATE TRIGGER make_thing_seq AFTER INSERT ON things FOR EACH ROW EXECUTE PROCEDURE make_thing_seq();</code>
Dadurch wird sichergestellt, dass immer dann, wenn eine neue Zeile in die things
-Tabelle eingefügt wird, eine entsprechende Sequenz erstellt wird.
Schließlich erstellen wir eine Triggerfunktion namens fill_in_stuff_seq
, die vor jeder Zeileneinfügung aufgerufen wird und die Spalte seq
mit dem entsprechenden nächsten Wert der Sequenz füllt.
<code class="language-sql">CREATE FUNCTION fill_in_stuff_seq() RETURNS trigger LANGUAGE plpgsql AS $$ begin NEW.seq := nextval('thing_seq_' || NEW.id); RETURN NEW; end $$;</code>
Erstellen Sie einen Trigger mit dem Namen stuff
in der Tabelle fill_in_stuff_seq
:
<code class="language-sql">CREATE TRIGGER fill_in_stuff_seq BEFORE INSERT ON stuff FOR EACH ROW EXECUTE PROCEDURE fill_in_stuff_seq();</code>
Dadurch wird sichergestellt, dass beim Einfügen einer Zeile in der stuff
-Tabelle der seq
-Wert automatisch basierend auf dem zugehörigen ID-Wert festgelegt wird.
Ergebnisse
Mit diesen Triggern kann die gewünschte Sequenzgenerierung erreicht werden. Durch das Einfügen von Daten in die Tabelle things
wird eine neue Sequenz erstellt, und durch das Einfügen von Daten in die Tabelle stuff
wird automatisch die richtige Sequenznummer basierend auf der ID-Referenz zugewiesen.
Durch die Kombination dieser Techniken können wir komplexe und flexible Datenstrukturen erstellen, die spezifische Sortieranforderungen erfüllen.
Das obige ist der detaillierte Inhalt vonWie kann ich benutzerdefinierte Untersequenzen in PostgreSQL basierend auf Fremdschlüsselwerten erstellen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!