【问题标题】:How to use enums in Oracle?如何在 Oracle 中使用枚举?
【发布时间】:2018-08-15 21:34:35
【问题描述】:

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

在 MySQL 中你可以这样做:

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

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

【问题讨论】:

    标签: database oracle enums


    【解决方案1】:

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

    【讨论】:

    • 你在 MySQL 中确实有 Enums,它们很有帮助 :) 无论如何谢谢!
    • 不确定这是不是更近了,但我想我会把它扔在那里。
    • 是的,这更接近,这也是我目前正在使用的解决方案,但只是希望有更好的方法
    • 不幸的是我需要支持 3 个不同的数据库,所以我不能使用 PL/SQL 或只坚持 MySQL 的好功能。
    • @User272735 - 是的,这仍然是在 11.2 中为此类约束建模的合适方法。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      在此链接中,您可以找到受 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。

      【讨论】:

      • 那是明确针对 PL/SQL 的(在文章标题中),并且 OP 明确表示他需要 SQL 而不是 PL/SQL。贾斯汀回答中的 cmets 还提到必须在多个数据库中工作,并且不能使用 Oracle 特定的功能。
      • 作为一名从 MySQL 开始并转向 Oracle 的开发人员,每天我都感到惊讶的是,企业产品缺少免费数据库产品的功能集。我想知道为什么这些类型在 MSSQL 或 PL/SQL 中不可用是否有明确的性能证明?
      • @JosephLust MySQL 枚举和 Oracle 有一个带检查约束的 varchar2 有什么区别?实际上,它们似乎是同一件事,但额外的好处是它不是一种新的数据类型。在 MySQL 中,一长串的列数据类型是相当荒谬的——拥有这么多必须有成本,至少是维护成本。
      • @fool4jesus 主要区别是存储要求+索引大小。 ENUM 允许您在 1 个字节中存储 255 个任意命名值。使用 varchar2 您需要根据名称为每行提供 X 个字节。 (或者改为使用带有 VIEW 或 JOIN 的单独查找表来查看第一个答案中提到的名称)。
      • @JosephLust 的 OT 解释是,昂贵的产品不一定(必然)质量更好,而只会更好地销售或营销。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      • 2013-02-11
      • 2019-07-08
      • 2017-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多