如何在Oracle中使用枚举?

时间:2008-10-15 01:48:38

标签: database oracle enums

如何仅使用SQL在Oracle中使用枚举? (没有PSQL)

在MySQL中你可以这样做:

CREATE TABLE sizes (
   name ENUM('small', 'medium', 'large')
);

在Oracle中执行此操作会有类似的方法吗?

3 个答案:

答案 0 :(得分:44)

读一下MySQL enum,我猜测最接近的等价物是一个简单的检查约束

CREATE TABLE sizes (
  name VARCHAR2(10) CHECK( name IN ('small','medium','large') )
);

但是这不允许您通过索引引用该值。更复杂的外键关系也是可能的

CREATE TABLE valid_names (
  name_id   NUMBER PRIMARY KEY,
  name_str  VARCHAR2(10)
);

INSERT INTO valid_sizes VALUES( 1, 'small' );
INSERT INTO valid_sizes VALUES( 2, 'medium' );
INSERT INTO valid_sizes VALUES( 3, 'large' );

CREATE TABLE sizes (
  name_id NUMBER REFERENCES valid_names( name_id )
);

CREATE VIEW vw_sizes
  AS 
  SELECT a.name_id name, <<other columns from the sizes table>>
    FROM valid_sizes a,
         sizes       b
   WHERE a.name_id = b.name_id

只要您通过视图操作,您似乎可以合理地复制功能。

现在,如果您接受PL / SQL解决方案,您可以创建自定义对象类型,其中可以包含限制它们可以容纳的值集的逻辑,以及获取ID和获取值的方法等。

答案 1 :(得分:1)

在此链接中,您可以找到针对Oracle的替代解决方案/解决方法,受C语言枚举的启发:http://www.petefinnigan.com/weblog/archives/00001246.htm

很快,Pete建议定义一些整数常量并使用SUBTYPE来构造它们:

RED constant number(1):=1;
GREEN constant number(1):=2;
BLUE constant number(1):=3;
YELLOW constant number(1):=4;

subtype COLORS is binary_integer range 1..4;

之后,您可以使用COLORS类型声明变量,传递参数并从函数返回值等等。

答案 2 :(得分:0)

为什么不对列使用约束?它将执行相同的操作:

ALTER TABLE x ADD CONSTRAINT size_constraint检查(x_size in(“小”,“中”,“大”))

相关问题