mysql - 什么相当于 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 集的替代品,但我不敢相信他们没有它!那么任何人都可以帮助我澄清这一点吗?
解决方案
在 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 )
);
推荐阅读
- vba - 如何在允许数组输入的 VBA UDF 中复制 Excel 的 TEXTJOIN 函数
- visual-studio-2017 - 如何在 Visual Studio 中获取启动项目列表?
- python - 在for循环python中更改API调用
- ios - Apple Notifications 服务扩展的内存限制是多少
- mysql - 为不同的关联续集相同的 N:M 表
- angular - 检查 Angular 6 组件中的自定义回调
- c - 来自 C 的 Boost.DateTime?
- .net-core - 如何运行独立的 .NET Core 测试?
- mysql - MySQL 外键约束的格式不正确
- javascript - 页面刷新后的Javascript编码