Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mencipta Urutan PostgreSQL Bergantung pada Lajur Lain?

Bagaimana untuk Mencipta Urutan PostgreSQL Bergantung pada Lajur Lain?

Mary-Kate Olsen
Lepaskan: 2025-01-24 05:58:13
asal
463 orang telah melayarinya

How to Create a PostgreSQL Sequence Dependent on Another Column?

PostgreSQL: Buat jujukan tambahan berdasarkan lajur lain

Dalam PostgreSQL, anda boleh mencipta jujukan yang bergantung pada lajur lain, membolehkan anda menjana nombor jujukan dalam subkumpulan jadual.

Pertimbangkan borang berikut:

<code class="language-sql">CREATE TABLE stuff (
    id integer PRIMARY KEY,
    seq integer NOT NULL,
    data text
);</code>
Salin selepas log masuk

Anda mahu setiap gabungan id dan seq unik, serupa dengan contoh berikut:

<code>ID  | SEQ   | DATA
----+------ +-------------------
 1  | 1     | Quick brown fox...
 1  | 2     | Quick brown fox...
 1  | 3     | Quick brown fox...
 2  | 1     | Quick brown fox...
 3  | 1     | Quick brown fox...</code>
Salin selepas log masuk

Buat jadual tambahan dan pencetus

Untuk melakukan ini, anda perlu mencipta dua jadual dan pencetus:

<code class="language-sql">CREATE TABLE things (
    id SERIAL PRIMARY KEY,
    name text
);

CREATE TRIGGER make_thing_seq AFTER INSERT ON things FOR EACH ROW
    EXECUTE PROCEDURE nextval('things_id_seq');

CREATE SEQUENCE things_id_seq;</code>
Salin selepas log masuk
Jadual

things ialah jadual induk yang mengandungi lajur id. Pencetus make_thing_seq secara automatik mencipta urutan baharu bernama things untuk setiap baris yang dimasukkan ke dalam jadual thing_seq_<thing_id>.

Isi urutan Bahan

Kini anda perlu mencipta pencetus kedua untuk mengisi lajur stuff dalam jadual seq:

<code class="language-sql">CREATE FUNCTION fill_in_stuff_seq() RETURNS trigger AS $$
BEGIN
  NEW.seq := nextval('thing_seq_' || NEW.id);
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER fill_in_stuff_seq BEFORE INSERT ON stuff FOR EACH ROW
    EXECUTE PROCEDURE fill_in_stuff_seq();</code>
Salin selepas log masuk

Pencetus ini memastikan bahawa apabila baris baharu dimasukkan ke dalam jadual stuff, ia mendapatkan semula jujukan yang sepadan (berdasarkan lajur id) dan memberikan nilai seterusnya kepada lajur seq. Ambil perhatian bahawa pernyataan LANGUAGE plpgsql ditambahkan di sini untuk menyatakan dengan jelas bahawa bahasa fungsi ialah PL/pgSQL.

Demo

Masukkan beberapa data dan sahkan penjanaan jujukan:

<code class="language-sql">INSERT INTO things (name) VALUES ('Joe');
INSERT INTO things (name) VALUES ('Bob');
SELECT * FROM things;

-- 检查序列表
\d+ things_id_seq

INSERT INTO stuff (id, data) VALUES (1, 'Keychain');
INSERT INTO stuff (id, data) VALUES (1, 'Pet goat');
INSERT INTO stuff (id, data) VALUES (2, 'Family photo');
INSERT INTO stuff (id, data) VALUES (1, 'Redundant lawnmower');
SELECT * FROM stuff;</code>
Salin selepas log masuk

Hasilnya akan menunjukkan penetapan urutan automatik berdasarkan lajur id. Perintah d things_id_seq digunakan untuk memaparkan butiran jujukan.

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Urutan PostgreSQL Bergantung pada Lajur Lain?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan