如何仅使用SQL在Oracle中使用枚举? (没有PSQL)
在MySQL中你可以这样做:
CREATE TABLE sizes (
name ENUM('small', 'medium', 'large')
);
在Oracle中执行此操作会有类似的方法吗?
答案 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(“小”,“中”,“大”))