2014-02-15 24 views
0

我想實現這個問題的接受的答案:PostgreSQL的字符串爲int的翻譯在存儲​​過程

How to model a (Java) Enum in a Database (with SQL92)

這是我的當前實現:

性別枚舉:

public enum Gender { 

    MALE, 
    FEMALE 

} 

性別表:

create table gender (
    gender_id bigserial not null, 
    name text not null, 
    primary key(gender_id) 
); 

用戶表:

create table system_user (
    user_id bigserial not null, 
    username text not null, 
    gender_id bigint references gender(gender_id), 
    primary key(user_id) 
); 

create trigger update_gender_enum_table before insert or update on system_user 
    for each row execute procedure update_gender_enum_table(); 

觸發:

create or replace function update_gender_enum_table() returns trigger as $update_gender_enum_table$ 
    begin 
     if not exists(select name from gender g where g.name = new.gender_id::text limit 1) 
     then 
      insert into gender (name) values (new.gender_id); 
     end if; 

     new.gender_id = (select gender_id from gender g where g.name = new.gender_id::text limit 1); 

     return new; 

    end; 
$update_gender_enum_table$ language plpgsql; 

目前插入語句失敗,因爲第二個參數是文本,而不是整數

insert into system_user (username, gender_id) values ('my_username', 'MALE'); 

ERROR: invalid input syntax for integer: "MALE" 

有什麼辦法將字符串作爲值傳遞給整數字段?或者我以一種錯誤的方式接近這一點。

回答

0

您可以爲您的枚舉添加一個id字段。

public enum Gender { 

    private int id; 

    MALE(1), 
    FEMALE(2); 

    Gender(int id) { 
     this.id=id; 
    } 

    public int getId() { 
     return this.id; 
    } 

    public static Gender valueById(int id) { 
     for(Gender gender : values()) { 
      if(id == gender.id) { 
       return gender; 
      } 
     } 
     throw new IllegalArgumentException("Unsupported id: "+id+" for enum "+Gender.class.getSimpleName()); 
    } 
} 

我已將代碼直接寫入此編輯器,因此它可能包含som語法錯誤。

您還可以使用枚舉的順序,但要注意,如果你添加更多的性別(即未知的)這個值可能會發生變化,因此可能不是一個好主意

0

首先,爲什麼你想比較整數與文本?

select name from gender g where g.name = new.gender_id::text limit 1 

因此,您正試圖比較男性3?

您的應用程序如何向用戶顯示性別?它不是來自性別表嗎?

如果您想要添加新的性別(在性別表中新增行),您需要知道名稱值,並將其插入性別,id列不重要,您只會將該值插入引用system_user表中。