如何在postgres中以整数类型存储字母数字值?

时间:2012-02-28 04:54:15

标签: database postgresql rdbms

我需要将人员的ID存储在Database.But中,id应该包含一个alpha开头,我已经按照以下内容,

对于id列我设置了默认值,如

create table alphanumeric (id int default ('f'||nextval('seq_test'))::int) ;

所以现在表格就像

一样
default (('f'::text || nextval('seq_test'::regclass)))::integer

创建表格后,我插入显示错误的值,如

INSERT INTO alpha VALUES (default) ;
ERROR:  invalid input syntax for integer: "f50" 

我理解错误,但我需要这种类型的存储.....!

注意:我不想使用函数或触发器。

2 个答案:

答案 0 :(得分:3)

只需在@ muistooshort的答案中添加几美分。如果您确定所需的ID始终符合某个正则表达式,则可以使用CHECK约束强制执行该操作:

CREATE TABLE alphanumeric (
  id VARCHAR DEFAULT ('f' || nextval('seqtest') PRIMARY KEY,
  ...
  CHECK(id ~ '^[A-Za-z][0-9]+')
);

当然,我对您的标识符的性质做了一个粗略的假设,您必须自己判断您的标识符是否构成常规语言。

其次,@muistooshort谈论的排序顺序有时(令人困惑)称为“自然排序”和you can get a PostgreSQL function to assist with this

答案 1 :(得分:2)

您希望为id使用字符串,因此请为id使用文字列:

create table alphanumeric (
    id text default ('f' || nextval('seq_test'))
)

如果您只对该列使用seq_test,那么您可能希望它为owned by that column

alter sequence seq_test owned by alphanumeric.id

这样一来,如果删除表格就会删除序列,并且不会有一个未使用的序列使数据库混乱。

你可能想要注意的关于这个id计划的一件事是他们不会按照人类对它们进行排序的方式进行排序;例如,'f100' < 'f2'将是正确的,这可能会产生您需要解决的副作用。