PostgreSQL-Sequenz basierend auf einer anderen Spalte
In PostgreSQL können Sie über einen Trigger eine Sequenz erstellen, die von einer anderen Spalte abhängt. Betrachten Sie die folgende Tabellenstruktur:
列名 | 数据类型 | 说明 |
---|---|---|
id | integer | 主键,外键关联其他表 |
seq | integer | 每个ID都有其自身的seq编号 |
data | text | 一些文本数据,与序列无关 |
Die ID-Seq stellt einen kombinierten eindeutigen Schlüssel dar.
Um die erwarteten Ergebnisse zu erzielen, müssen zwei Tabellen erstellt werden: Dinge und Sachen.
Tabelle erstellen:
<code class="language-sql">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) );</code>
Sequenzauslöser erstellen:
Setzen Sie einen Auslöser für die Dinge-Tabelle, um für jede Zeile eingefügter Daten eine neue Sequenz zu erstellen:
<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 $$; CREATE TRIGGER make_thing_seq AFTER INSERT ON things FOR EACH ROW EXECUTE PROCEDURE make_thing_seq();</code>
Auslöser der Füllsequenz:
Erstellen Sie abschließend einen Trigger für die Stuff-Tabelle und achten Sie dabei darauf, für jede Einfügung die richtige Reihenfolge zu verwenden:
<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 $$; CREATE TRIGGER fill_in_stuff_seq BEFORE INSERT ON stuff FOR EACH ROW EXECUTE PROCEDURE fill_in_stuff_seq();</code>
Demo:
In die Things- und Stuff-Tabellen eingefügte Daten erstellen und verwenden die entsprechenden Sequenzen. Zum Beispiel:
<code class="language-sql">insert into things (name) values ('Joe'); insert into things (name) values ('Bob'); insert into stuff (id, notes) values (1, 'Keychain'); insert into stuff (id, notes) values (1, 'Pet goat'); insert into stuff (id, notes) values (2, 'Family photo'); insert into stuff (id, notes) values (1, 'Redundant lawnmower');</code>
Das Ergebnis wird sein:
<code>| id | seq | notes | |---|---|---| | 1 | 1 | Keychain | | 1 | 2 | Pet goat | | 2 | 1 | Family photo | | 1 | 3 | Redundant lawnmower |</code>
Dieser Ansatz erstellt effektiv eine Sequenz basierend auf der ID-Spalte der Things-Tabelle und stellt sicher, dass für jede ID eine eindeutige Sequenz generiert wird.
Das obige ist der detaillierte Inhalt vonWie erstelle ich mithilfe von Triggern PostgreSQL-Sequenzen, die von einer anderen Spalte abhängig sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!