我如何在PostgreSQL中创建前导0序列?
对于MySQL,我知道可以使用BIGINT(10)UNSIGNED ZEROFILL AUTO_INCREMENT
,但是在PostgreSQL中,我找不到等效的方式(只有bigserial
)。
此外,我该如何限制0的数量,因为BIGINT(10)
表示10个符号,bigserial
类型是否有这样的限制?
我如何在PostgreSQL中创建前导0序列?
对于MySQL,我知道可以使用BIGINT(10)UNSIGNED ZEROFILL AUTO_INCREMENT
,但是在PostgreSQL中,我找不到等效的方式(只有bigserial
)。
此外,我该如何限制0的数量,因为BIGINT(10)
表示10个符号,bigserial
类型是否有这样的限制?
创建一个常规的序列,然后使用 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 Donchevto_char(1, 'FM0000')
。 - cimmanon在“填充前导零”任务中,比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')
lpad()
是替代to_char()
的好选择。注意:lpad
在溢出时不会生成错误,请参见 SELECT lpad(4444::text, 3, '0'), to_char(4444, '000')
。 - Peter Krauss
BIGINT(10)
并不会限制值只能为10位数字。您可以在定义为此类型的列中存储任何数字。 - user330315