将表列更改为int(9)UNSIGNED ZEROFILL NOT NULL

时间:2017-10-23 12:00:10

标签: postgresql

阅读以下链接后..

https://dba.stackexchange.com/questions/94443/how-should-a-numeric-value-that-is-an-external-key-be-stored

我决定将文本中的列更改为:

int(9) UNSIGNED ZEROFILL NOT NULL

但是,我不确定要使用的SQL语句。我知道下面的内容不正确,因为它不包括9位数,无符号的zerofill而不是NULL参数。

ALTER TABLE "Organizations" ALTER COLUMN "EIN" TYPE INTEGER using "EIN"::INTEGER

更新: 由于Postgres不使用zerofill或INT(9)。 9位数的EIN号的推荐数据类型是什么?

2 个答案:

答案 0 :(得分:2)

我会在下面的两个陈述中推荐以下内容:

ALTER TABLE "Organizations" ALTER COLUMN "EIN" TYPE INTEGER using "EIN"::INTEGER;
ALTER TABLE "Organizations" ALTER COLUMN "EIN" SET NOT NULL;

使用padding零的装饰可以通过客户端(或规则,有效只是一个视图,选择相反,然后我认为在这里过度复杂 - (和更改为int以选择带有零的文本 - 不进行选择)进行选择sound reasonambe))),例如:

t=# select lpad(123::int::text,9,'0');
   lpad
-----------
 000000123
(1 row)

所以如果需要,可以嘲笑

答案 1 :(得分:1)

对于9位数限制,int以上的域可以正常工作:

CREATE DOMAIN ein AS int CHECK (VALUE>0 AND VALUE<1000000000);

然后ein可以在声明中用作类型,例如:

=> CREATE TABLE test(id ein, t text);
CREATE TABLE

=> insert into test values(2*1e9::int);
ERROR:  value for domain ein violates check constraint "ein_check"

=> insert into test values(100);
INSERT 0 1

zerofill位不同,它是关于演示,而不是存储, 并且该部分不能专门用于域。

您可以改为将to_char应用于值,例如:

=> select to_char(id,'000000000') from test;
  to_char  
------------
  000000100

并可能通过存储的视图或演示文稿访问它 仅将ein作为参数的函数 如果您更愿意从客户端抽象出来。

为了更进一步,您可以使用CREATE TYPE创建完整类型 支持CINPUT函数的OUTPUT代码,这些函数可以实现9位左填充格式作为输入/输出格式,这样用户可能永远不会看到SQL级别的任何其他内容。