首页 > 解决方案 > 什么相当于 Oracle 中的 MySQL Set 数据类型?

问题描述

在 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 文档参考 原始链接

标签: mysqlsqldatabaseoracleoracle12c

解决方案


在 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 ) 
);

推荐阅读