mysql - 什么是 Oracle 中 MySQL Set 数据类型的等价物?

标签 mysql sql database oracle oracle12c

在 MySQL 中,我们可以使用 Set 数据类型为任何特定行的每一列选择多个值,如下所示:

CREATE TABLE `staff` ( `StaffID` int(5) NOT NULL AUTO_INCREMENT,
                  `Availability` set('Mon','Tue','Wed','Thur','Fri','SatAM','SatPM','Sun') DEFAULT NULL, 
                  PRIMARY KEY (`StaffID`))

那我可以,

INSERT INTO `staff` (`Availability`) VALUES ('Tue,Wed,SatPM')

我试图到处寻找,但找不到任何合适的数据类型来存储上述在 Oracle 中的多个选定选项。 Oracle 文档似乎显示 MySQL 集别无选择,但我不敢相信他们没有!那么有人可以帮我澄清一下吗?

Oracle Documentation reference Original link

最佳答案

在 MySQL 中,set 数据类型是一种命名的位图数据类型。 Oracle 没有,但如果您真的想使用受约束的整数数据类型,您可以模拟它:

CREATE TABLE staff (
    staffid INTEGER GENERATED BY DEFAULT AS IDENTITY ( START WITH 1 NOCACHE ORDER ) NOT NULL PRIMARY KEY
  , availability INTEGER CHECK ( availability BETWEEN 0 AND 256 )
);

您必须记住或构建一个函数来映射位图值和日期。

另一种选择是使用查找表:

create table availability as
with t1(id, mon, tue, wed, thu, fri, satam, satpm, sun) as (
select 0, 0, 0, 0, 0, 0, 0, 0, 0 from dual
union all
select id+1
     , sign(bitand(id+1,1))
     , sign(bitand(id+1,2))
     , sign(bitand(id+1,4))
     , sign(bitand(id+1,8))
     , sign(bitand(id+1,16))
     , sign(bitand(id+1,32))
     , sign(bitand(id+1,64))
     , sign(bitand(id+1,128))
  from t1 where id+1 <256
)
select * from t1;

alter table availability add primary key (id);

CREATE TABLE staff (
    staffid INTEGER GENERATED BY DEFAULT AS IDENTITY ( START WITH 1 NOCACHE ORDER ) NOT NULL PRIMARY KEY
  , availability INTEGER 
  , CONSTRAINT staff_avail_fk FOREIGN KEY ( availability ) REFERENCES availability ( id ) 
);

关于mysql - 什么是 Oracle 中 MySQL Set 数据类型的等价物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53560322/

相关文章:

Mysql查询根据条件选择不同的记录?

sql - MySQL 列值透视

mysql - hibernate 通信链接失败

sql - 导出 Azure SQL 数据库时出现错误 SQL71501

c# - 解析现有的 "complex"SQL 语句并转换为对自定义 API 调用的调用

PHP MySQL 根据第一个查询的结果从两个不同的表进行查询

php - mysql 到 mysqli php,只需输入 "i"?

使用嵌套 Case 语句的 SQL 行到列

mysql - 如何有效地存储这种语言设置数据?

mysql - 我应该尽可能避免复合主键吗?