我想要做一个主键,例如:
ABCD000012018, ABCD000022018, ABCD000032018
并每年重置为00001,因此在2019年它将变为 ABCD000012019
所以
答案 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)