2012-02-28 44 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