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