Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mencipta Suburutan Tersuai dalam PostgreSQL Berdasarkan Nilai Utama Asing?

Bagaimanakah Saya Boleh Mencipta Suburutan Tersuai dalam PostgreSQL Berdasarkan Nilai Utama Asing?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-24 05:47:16679semak imbas

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:

How Can I Create Custom Sub-Sequences in PostgreSQL Based on Foreign Key Values?

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

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

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn