postgres制作主键字符串+整数

时间:2018-07-23 07:17:03

标签: postgresql

我想要做一个主键,例如:

ABCD000012018, ABCD000022018, ABCD000032018

并每年重置为00001,因此在2019年它将变为 ABCD000012019

所以

  • 什么是最好的方法。
  • 我应该再制作一张表来存储计数器和年份零件吗?
  • 如果我创建了其他表,则应该自动重置年份和计数器(然后我必须取决于服务器日期和时间),或者手动设置计数器和年份。

1 个答案:

答案 0 :(得分:0)

我不会将此作为我的主键。在我看来,这更像是一种外部表现。

我的一个想法是使用常规数字计数器作为主键,并将当前年份存储在每一行中。然后保留第二张表,用于存储每年的最少数量。

在输出中,与第二个表连接,并从主键中减去该年份的最小值,并生成您想要即时获得的值。

这是一个小例子:

CREATE TABLE t (
   id bigint GENERATED ALWAYS AS IDENTITY,
   year smallint DEFAULT extract(year FROM current_timestamp),
   label text
);

CREATE TABLE min_id_per_year(
   year smallint PRIMARY KEY,
   min_id bigint NOT NULL
);

在每年年初,您向min_id_per_year添加一行:

INSERT INTO min_id_per_year VALUES (2018, 1);

现在我们插入两行:

INSERT INTO t (label) VALUES ('label one'), ('label two');

这是在查询表时生成所需ID的方法:

SELECT 'ABCD' || to_char(t.id - m.min_id + 1, '00000FM') || year::text AS id,
       label
FROM t
   JOIN min_id_per_year m USING (year);

      id       |   label   
---------------+-----------
 ABCD000012018 | label one
 ABCD000022018 | label two
(2 rows)