为数据库中的列设置预定义值

时间:2012-03-09 00:37:32

标签: database

我正在创建一个表

create tabel xyz
( id number (10) not null,
  code char(1) ,

primary key (id)
)

我希望用户拥有代码列的预定义值,如P,S,C。 怎么做? 目前我正在使用代码char(1)DEFAULT('P','S','C') 但有了这个,我收到了错误。 请建议,我也希望此列不为空...

3 个答案:

答案 0 :(得分:1)

ENUM列类型很容易,但可以回来困扰你。我建议添加一个“查找”表,它将容纳您所说的值,然后在主对象表中添加“value_id”列,如:

primary_table:
    id
    value_id

value_table:
    id:
    name: #P, S, C

如果您的表很大并且您需要更改任何枚举值,则必须在表上运行alter,这可能意味着显着的停机时间。

答案 1 :(得分:0)

假设您使用的是mysql,请使用enum:

code ENUM('P', 'S', 'C')

http://dev.mysql.com/doc/refman/5.0/en/enum.html

答案 2 :(得分:0)

如果需要向用户显示这些值,最简单的方法是创建另一个表,并使用外键引用。您可以在强制执行CHECK约束的dbms中将其实现为CHECK约束,但向用户提供有效选择会很麻烦。

-- You'll want to restrict permissions on this table pretty tightly. Very few
-- people should be allowed to change it.
create table xyz_codes (
  code char(1) primary key CHECK (code in ('P', 'S', 'C'))
);

insert into xyz_codes values ('P'), ('S'), ('C');

create table xyz ( 
  id integer primary key,
  code char(1) references xyz_codes (code)
);

完成此操作后,以下INSERT语句将因外键违规而失败。

insert into xyz values (1, 'D');

但这一次会成功。

insert into xyz values (1, 'C');

要选择有效的演示选择以供用户使用,请使用

select code 
from xyz_codes
order by code;