我正在努力实现这个问题的接受答案:
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 :(得分: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语法错误。
您也可以使用枚举的序数,但要注意,如果添加更多性别(即未知),此值可能会更改,因此可能不是一个好主意
答案 1 :(得分:0)
首先,您为什么要尝试将整数与文本进行比较?
select name from gender g where g.name = new.gender_id::text limit 1
所以你试图比较,例如MALE有3?
您的应用程序如何向用户显示性别?它不是来自性别表吗?
如果要添加新的性别(因此性别表中的新行),您需要知道名称值,并将其插入性别,id列并不重要,您只需将值插入引用system_user表。