首页 > 数据库 > mysql教程 > 如何创建依赖于另一列的 PostgreSQL 序列?

如何创建依赖于另一列的 PostgreSQL 序列?

Mary-Kate Olsen
发布: 2025-01-24 05:58:13
原创
510 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板