44

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

在 MySQL 中,您可以执行以下操作:

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

在 Oracle 中执行此操作的类似方法是什么?

4

3 回答 3

58

阅读一些关于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 和获取值的方法等。

于 2008-10-15T02:36:05.763 回答
2

为什么不对列使用约束?它会做同样的事情:

ALTER TABLE x ADD CONSTRAINT size_constraint check (x_size in ('small', 'medium', 'large'))

于 2018-08-15T13:34:35.920 回答
1

在此链接中,您可以找到受 C 语言枚举启发的 Oracle 替代解决方案/解决方法: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 类型声明变量、传递参数和从函数返回值等。

于 2011-02-08T09:04:59.223 回答