PostgreSQL 复合键自动编号:一种简化的方法
跟踪个人地址随时间的变化需要为个人历史记录中的每个变化提供唯一的标识符。 虽然存在复杂的自动编号方案,但 PostgreSQL 使用串行或 IDENTITY 列提供了更干净、更高效的解决方案。
避免复杂性
传统方法通常会导致编号系统错综复杂且容易出错。 PostgreSQL 的内置功能提供了一种简化的替代方案。
推荐的解决方案:序列/IDENTITY 列
利用 PostgreSQL 的 serial
或 IDENTITY
列可以显着简化该过程。 这消除了管理复杂序列的需要。
实现示例
以下是如何在 address_history
表中实现此功能:
<code class="language-sql">CREATE TABLE address_history ( address_history_id serial PRIMARY KEY, person_id int NOT NULL REFERENCES people(id), created_at timestamptz NOT NULL DEFAULT current_timestamp, previous_address text );</code>
检索序列号
要获取每个人每次地址变更的序列号,请使用 row_number()
窗口函数:
<code class="language-sql">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;</code>
此视图可直接替换查询中的 address_history
表,为每个地址更改提供序列号 (adr_nr
)。
主要改进
timestamptz
(带时区的时间戳)以提高准确性和一致性。address
和original_address
列,简化表结构。 只需要previous_address
。以上是如何在PostgreSQL中高效实现复合键自动编号?的详细内容。更多信息请关注PHP中文网其他相关文章!