2012-02-28 21 views
1

我需要存储的人Database.But的ID标识应包含在开始的一个字母,我都遵循如下的东西,如何在postgres中以整数类型存储字母数字值?

id的专栏中,我设置的默认值像

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

所以现在桌子上像

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

创建创建我插入它显示错误的价值观像

表后

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

注:我不想使用的功能或触发器。

+0

你正在将它转换为'int',但它是'text'。你不能那样做。从'DEFAULT'中删除':: integer'。 – 2012-02-28 04:56:42

+0

如果我拿出类型转换整数,在创造它自己的说法错误**错误:列“ID”的类型是整数,但默认表情是文本类型的 提示:您将需要重写或铸表达** – RoCkStUnNeRs 2012-02-28 04:59:27

回答

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'将是真实的,可能有副作用,您需要解决。

+0

是否可以存储'f2'整数类型 – RoCkStUnNeRs 2012-02-28 06:10:27

+3

你不能这样做。期。您不能将'f2'存储为整数,因为它不是整数。您不能将汽车存放在面包箱中。你不能在一个炉子里储存一个冰块。你不能将受伤的羊存放在狼窝里。你不能在一个整数中存储'f2'。 – 2012-02-28 06:17:54

+0

@DanielLyons:我也可以在面包箱中储存[汽车](http://en.wikipedia.org/wiki/Dinky_car)。 – 2012-02-28 06:23:45

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

相关问题