检查(长度(to_char(nif,' FM999MI'))= 9))

时间:2017-11-01 22:38:08

标签: sql database postgresql

我有一个带有nif列的表,在我尝试这样做之后,它必须是9位数字:

CREATE TABLE fornecedor(
    nif numeric(9) PRIMARY KEY,
    nome varchar(64) NOT NULL,
    CONSTRAINT nif_tamanho CHECK (length(to_char(nif, 'FM999MI')) = 9)); 

INSERT INTO fornecedor(nif, nome) VALUES (123456789, 'Pmsmm');

它返回错误说:

错误:关系的新行" fornecedor"违反了检查约束" nif_tamanho"

如何确保插入的数字完全符合9位?

提前致谢

1 个答案:

答案 0 :(得分:0)

正如您在评论中提到的,如果您不想丢失前导零,则需要字符串数据类型。

但我认为正确的解决方案取决于您希望如何使用该列。根据列的语义选择数据类型总是好的。

如果您需要对数据进行算术或数字比较,请一定选择integer(您可以在nif < 100000000上添加检查约束)。当您将值转换为输出字符串时,您始终可以使用前导零格式化值。

如果你需要对值进行字符串操作(例如子字符串),最好将数据存储为sting类型。