首頁 >資料庫 >mysql教程 >如何建立依賴另一列的 PostgreSQL 序列?

如何建立依賴另一列的 PostgreSQL 序列?

Mary-Kate Olsen
Mary-Kate Olsen原創
2025-01-24 05:58:13525瀏覽

How to Create a PostgreSQL Sequence Dependent on Another Column?

PostgreSQL:基於另一列建立輔助序列

在PostgreSQL中,您可以建立一個依賴另一列的序列,讓您在表格的子群組內產生順序號碼。

考慮以下表格:

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

您希望id和seq的每種組合都是唯一的,類似於以下範例:

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

建立輔助表和觸發器

為此,您需要建立兩個表和一個觸發器:

<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表格是包含id列的父表。 make_thing_seq觸發器會為插入到things表中的每一行自動建立一個新的序列,命名為thing_seq_<thing_id>

填充Stuff序列

現在,您需要建立第二個觸發器來填入stuff表中的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>

此觸發器確保當向stuff表插入新行時,它會檢索相應的序列(基於id列)並將它的下一個值分配給seq列。 注意,這裡加入了LANGUAGE plpgsql聲明,明確指定函數的語言為PL/pgSQL。

示範

插入一些資料並驗證序列產生:

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

結果將示範基於id列的序列的自動分配。 d things_id_seq命令用於顯示序列的詳細資訊。

以上是如何建立依賴另一列的 PostgreSQL 序列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn