Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mencipta Suburutan Tersuai dalam PostgreSQL Berdasarkan Nilai Utama Asing?
Penjanaan susulan tersuai PostgreSQL: kaedah penciptaan jujukan berdasarkan nilai kunci asing
Artikel ini meneroka cara mencipta urutan tersuai berdasarkan nilai kunci asing dalam PostgreSQL. Urutan PostgreSQL biasanya digunakan untuk menjana pengecam unik untuk baris dalam jadual, tetapi dalam beberapa kes anda mungkin memerlukan penjanaan jujukan untuk bergantung pada nilai lajur lain, sekali gus mencipta jujukan.
Imej berikut menunjukkan inti masalah:
Penjanaan jujukan berdasarkan korelasi tersuai
Pertimbangkan struktur jadual berikut:
列名 | 数据类型 | 说明 |
---|---|---|
id | integer | 外键,指向另一张表 |
seq | integer | 每个id的序列号 |
data | text | 无关信息 |
Matlamatnya adalah untuk membina sistem pengecam di mana setiap gabungan unik id dan seq sepadan dengan baris dalam jadual.
PostgreSQL mencapai ini melalui gabungan pintar reka bentuk jadual dan pencetus. Kita boleh mencipta dua jadual: things
dan stuff
, dengan things
mewakili pengecam unik dan stuff
menyimpan data sebenar yang dikaitkan dengan setiap pengecam.
Buat jadual dan pencetus
things
Jadual boleh mencipta id sebagai kunci utama:
<code class="language-sql">CREATE TABLE things ( id serial primary key, name text );</code>
Untuk jadual stuff
, kami mentakrifkan gabungan id dan seq sebagai kunci utama:
<code class="language-sql">CREATE TABLE stuff ( id integer references things, seq integer NOT NULL, notes text, primary key (id, seq) );</code>
Seterusnya, kami melaksanakan fungsi pencetus bernama things
pada jadual make_thing_seq
. Pencetus ini dipanggil selepas setiap sisipan baris dan mencipta urutan baharu dengan id yang dimasukkan.
<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>
Kemudian, kami mencipta pencetus bernama things
pada jadual 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>
Ini memastikan bahawa setiap kali baris baharu dimasukkan ke dalam jadual things
, urutan yang sepadan dibuat.
Akhir sekali, kami mencipta fungsi pencetus bernama fill_in_stuff_seq
yang dipanggil sebelum setiap sisipan baris dan mengisi lajur seq
dengan nilai urutan seterusnya yang sesuai.
<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>
Buat pencetus bernama stuff
pada jadual 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>
Ini memastikan bahawa apabila satu baris dalam jadual stuff
disisipkan, nilai seq
ditetapkan secara automatik berdasarkan nilai id yang berkaitan.
Keputusan
Dengan pencetus ini, penjanaan jujukan yang diingini boleh dicapai. Memasukkan data ke dalam jadual things
akan mencipta jujukan baharu dan memasukkan data ke dalam jadual stuff
akan secara automatik menetapkan nombor jujukan yang betul berdasarkan rujukan id.
Dengan menggabungkan teknik ini, kami boleh mencipta struktur data yang kompleks dan fleksibel yang memenuhi keperluan pengisihan khusus.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencipta Suburutan Tersuai dalam PostgreSQL Berdasarkan Nilai Utama Asing?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!