我试图维护一个地址历史表:
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
。
另外,有没有更好/内置的方式来维护这样的历史记录?
不要。已经试过很多次了,很痛苦。
使用普通序列号
或标识
列:
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;
请参见:
或者您可能想按其他方式订购
。也许是created_at
?更好的created_at,address_history_id
打破可能的联系。相关答案:
此外,您要查找的数据类型是时间戳
或timestamptz
,而不是<罢工>日期时间
Postgres中的:
您只需要存储previous_address
(或更多详细信息),而不是<罢工>地址
,也不是<罢工>原始地址
。在健全的数据模型中,两者都是多余的。
问题内容: 是否可以在普通的JPA或JPA + Hibernate扩展中声明复合键,而复合键的元素是一个序列? 这是我的复合课程: 我已经提供的值,,和。我想构造一个像下面这样的实体: 当我调用)时,我希望生成并插入集成。 这可能吗?如果是这样,简单的方法是什么?(我不想使用应用程序提供的密钥或本机sql)。 问题答案: 我相信使用普通的JPA是不可能的。
我有如下所示的电影实体。我需要根据电影代码对所有实体进行分组,实现如下。现在我需要按扫描日期时间按降序{latest first}对哈希映射的值进行排序。我可以在按流程分组时执行此操作。这里的关键是电影实体的列表。
有人知道解决这个问题的办法吗?或者这是不可能使用Hibernate/JPA进行映射的吗? Edit:Article和Location的(简化)定义(真的没那么有趣,重要的是它们使用了复合主键):
我有一个表,表中有一些列。两列有组合框,现在我想做的是,当用户从column1组合框中选择一些值时,根据用户选择的值,应该填充column2组合框。例如,如果用户从column1组合框中选择value1,则column2组合框将仅显示与value1对应的值。
问题内容: 我试图查看是否可以将组合键中的列之一用作外键。我得到了奇怪的结果。 MySQL允许创建仅引用主键第一列而不引用第二列的外键。这奇怪吗?还是我很愚蠢! 问题答案: 正如有关外键的MySQL文档所指出的那样: InnoDB允许外键引用任何索引列或列组。但是,在被引用的表中,必须有一个索引,其中被引用的列以相同的顺序列为第一列。 NDB在引用为外键的任何列上都需要一个显式的唯一键(或主键)。
我想要一个列表,它是列表元素列表的组合,例如:我的输入 输出应该是 非常感谢您的帮助。