当前位置: 首页 > 知识库问答 >
问题:

复合键每组行的序列号

鱼宜
2023-03-14

我试图维护一个地址历史表:

CREATE TABLE address_history (
    person_id int, 
    sequence int,
    timestamp datetime default current_timestamp,
    address text,
    original_address text,
    previous_address text,
    PRIMARY KEY(person_id, sequence),
    FOREIGN KEY(person_id) REFERENCES people.id
);

我想知道是否有一种简单的方法可以在address_history中自动编号/约束序列,以便为每个 从1开始自动计数。

换句话说,person_id = 1 的第一行将获得序列 = 1;person_id = 1 的第二行将获得序列 = 2。第一行person_id = 2,将再次得到序列 = 1
另外,有没有更好/内置的方式来维护这样的历史记录?

共有1个答案

平俊茂
2023-03-14

不要。已经试过很多次了,很痛苦。

使用普通序列号标识列:

  • 自动递增表列
CREATE TABLE address_history (
  address_history_id serial PRIMARY KEY
, person_id int NOT NULL REFERENCES people(id)
, created_at timestamp NOT NULL DEFAULT current_timestamp
, previous_address text
);

使用窗口函数 row_number() 获取每个person_id没有间隙的序列号。您可以保留一个 VIEW,您可以在查询中将其用作表的直接替换,以准备好这些数字:

CREATE VIEW address_history_nr AS
SELECT *, row_number() OVER (PARTITION BY person_id
                             ORDER BY address_history_id) AS adr_nr
FROM   address_history;

请参见:

    < li >涉及多个表的多个事务的无间隙序列

或者您可能想按其他方式订购。也许是created_at?更好的created_at,address_history_id打破可能的联系。相关答案:

  • 具有备用序列的列

此外,您要查找的数据类型是时间戳timestamptz,而不是<罢工>日期时间Postgres中的:

  • 在Rails和PostgreSQL中完全忽略时区

您只需要存储previous_address(或更多详细信息),而不是<罢工>地址 ,也不是<罢工>原始地址 。在健全的数据模型中,两者都是多余的。

 类似资料:
  • 问题内容: 是否可以在普通的JPA或JPA + Hibernate扩展中声明复合键,而复合键的元素是一个序列? 这是我的复合课程: 我已经提供的值,,和。我想构造一个像下面这样的实体: 当我调用)时,我希望生成并插入集成。 这可能吗?如果是这样,简单的方法是什么?(我不想使用应用程序提供的密钥或本机sql)。 问题答案: 我相信使用普通的JPA是不可能的。

  • 我有如下所示的电影实体。我需要根据电影代码对所有实体进行分组,实现如下。现在我需要按扫描日期时间按降序{latest first}对哈希映射的值进行排序。我可以在按流程分组时执行此操作。这里的关键是电影实体的列表。

  • 有人知道解决这个问题的办法吗?或者这是不可能使用Hibernate/JPA进行映射的吗? Edit:Article和Location的(简化)定义(真的没那么有趣,重要的是它们使用了复合主键):

  • 我有一个表,表中有一些列。两列有组合框,现在我想做的是,当用户从column1组合框中选择一些值时,根据用户选择的值,应该填充column2组合框。例如,如果用户从column1组合框中选择value1,则column2组合框将仅显示与value1对应的值。

  • 问题内容: 我试图查看是否可以将组合键中的列之一用作外键。我得到了奇怪的结果。 MySQL允许创建仅引用主键第一列而不引用第二列的外键。这奇怪吗?还是我很愚蠢! 问题答案: 正如有关外键的MySQL文档所指出的那样: InnoDB允许外键引用任何索引列或列组。但是,在被引用的表中,必须有一个索引,其中被引用的列以相同的顺序列为第一列。 NDB在引用为外键的任何列上都需要一个显式的唯一键(或主键)。

  • 我想要一个列表,它是列表元素列表的组合,例如:我的输入 输出应该是 非常感谢您的帮助。