0

假设您有一个 STORE 表,其中包含一个接受值 (OPEN,CLOSED) 的 varchar 列 STATUS

在java方面,特别是在你的sqls中,我发现自己在写这样的查询

select * from store where status='OPEN'

现在这不是书面合同,并且存在许多错误。

我想管理在 db 端添加新状态或重命名现有状态并在 java 端处理它的情况。例如,如果在 STORE 表上,如果所有带有 OPEN 的状态都更改为 OP,我的 sql 代码将失败。

PS:这个问题实际上与编程语言和数据库服务器无关,但我用java标记它,因为我处理它更多。

4

2 回答 2

1

你的需求有点奇怪。通常事情不会只是在数据库中“发生”,而且您不必处理它。相反,您决定更改应用程序中的内容,同时更改代码和迁移数据。

话虽如此,如果您想确保您的数据与一组众所周知的值一致,您可以创建库表。在你的情况下:

create table STORE (status varchar(32))  -- your table
create table LIB_STORE_STATUS (status varchar(32) unique)  -- a lib table for statuses
alter table STORE add constraint FK_STORE_STATUS foreign key (status) references LIB_STORE_STATUS(status)  -- constraints the values in your STORE table

然后:

insert into STORE values ('A') -- fails
insert into LIB_STORE_STATUS values ('A')
insert into STORE values ('A') -- passes

有了这个,您只需要确保您的 lib 表始终与您的代码同步(即使用 JPA@Enumerated(EnumType.STRING)映射策略时的枚举名称)。

于 2013-04-10T09:43:58.013 回答
0

使用枚举,可以直接映射到枚举实例名(不需要转换为int序号)

但在这种情况下,我会有一个名为 open 的布尔/位列,它的可能值是真或假。

(布尔值在大多数数据库中为 0/1 位)

于 2013-04-10T09:49:19.687 回答