我正在尝试维护地址历史记录表:
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
);
我想知道是否有一种简单的方法可以自动编号/约束sequence
中的address_history
以自动从每个person_id
的1开始计数。
换句话说,具有person_id = 1
的第一行将得到sequence = 1
; person_id = 1
的第二行将得到sequence = 2
。具有person_id = 2
的第一行将再次获得sequence = 1
。等等。另外,是否有更好/内置的方式来维护这样的历史记录?
serial
或IDENTITY
列: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
保留为查询中的表的替代品,以准备好这些数字: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;
ORDER BY
?更好的created_at
打破可能的联系。相关答案:created_at, address_history_id
timestamp
,而不是Postgres中的timestamptz
:datetime
previous_address
或address
。两者在健全的数据模型中都是多余的。