如何创建 PostgreSQL 带前导零的序列(零填充)

10

我如何在PostgreSQL中创建前导0序列?

对于MySQL,我知道可以使用BIGINT(10)UNSIGNED ZEROFILL AUTO_INCREMENT,但是在PostgreSQL中,我找不到等效的方式(只有bigserial)。

此外,我该如何限制0的数量,因为BIGINT(10)表示10个符号,bigserial类型是否有这样的限制?


1
在MySQL中,BIGINT(10)不会限制值只能为10位数字。您可以在定义为此类型的列中存储任何数字。 - user330315
2个回答

14

创建一个常规的序列,然后使用 to_char() 函数在其左侧填充零。您的数据类型将是 char(),因为Postgres不支持对整数类型进行 zerofill。


是的,我也想到了这样的方法,但我在想是否还有其他方法。所以它看起来像这样: CREATE SEQUENCE seq_test INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807 START 1 CACHE 1; 然后对于键:id character(11) NOT NULL DEFAULT to_char(nextval('seq_test'), '0000000000') PRIMARY KEY。仍然不明白为什么 character(10) 不起作用,而符号只有 10 个 :) - Vasilen Donchev
3
to_char()函数在负数整数前添加一个额外的空格,用于表示负号。例如,如果您在模式中使用了10个“0”,则会得到一个11个字符长的字符串。请注意,该翻译不包括任何解释性的内容。 - m1tk4
1
您可以使用“FM”前缀从to_char()中删除空格:to_char(1, 'FM0000') - cimmanon

11

在“填充前导零”任务中,比to_char()更好的替代方法是lpad()

create table TableName(columnName serial primary key);

select lpad(columnName::text, 3, '0'), * from TableName;

注意:在溢出时,lpad()不会生成错误,例如:

select lpad(4444::text, 3, '0'), to_char(4444, '000')

2
翻译为中文:对于“填充前导零”的任务,lpad()是替代to_char()的好选择。注意:lpad在溢出时不会生成错误,请参见 SELECT lpad(4444::text, 3, '0'), to_char(4444, '000') - Peter Krauss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接