如何在SQL中定义枚举类型

zfybs 2015-06-03 11:45:48
如果我想在SQL中定义枚举类型,用来限制某列数据的输入,应该怎么定义啊。
我听说可以通过外键实现,但是外键只能关联到一个表中有唯一约束的列,这里有一个问题,在一个表中以不同的列来定义不同的枚举类型,那么当枚举类型中的枚举项的个数不一样时怎么办?
如果下图:“枚举类型2”中出现了两个Null,那么此时由于唯一性约束,就会出现报错。



有什么好的方法吗,如果不行的话,岂不是要为每一个枚举类型创建一个表了吗?
...全文
4520 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcmakebest 2015-06-07
  • 打赏
  • 举报
回复
SQL中本来就没有什么枚举类型,楼主既然是替代方法,就辛苦点吧,给每个所谓的枚举建表,并在其他表中建外键
zfybs 2015-06-07
  • 打赏
  • 举报
回复
实际设计中有通过创建很多张表来专门存放枚举值的吗?
道玄希言 2015-06-05
  • 打赏
  • 举报
回复
引用 14 楼 zfybs 的回复:
是如同 shoppo0505 所说,一个枚举建一个表,然后进行外键约束吗?
想通过数据库实现, 就是这样了.
zfybs 2015-06-05
  • 打赏
  • 举报
回复
引用 11 楼 rfq 的回复:
表格 , 什么枚举 不能做
是如同 shoppo0505 所说,一个枚举建一个表,然后进行外键约束吗?
卖水果的net 版主 2015-06-05
  • 打赏
  • 举报
回复
sql server 没有这样的功能 。
zfybs 2015-06-05
  • 打赏
  • 举报
回复
引用 9 楼 yangb0803 的回复:
虽然象5楼说的, 可以通过表外键约束来实现枚举类型的定义 但还是不建议在数据库中实现, 这部分用程序控制比较好了, 比如, 你一个超出枚举范围的项, 本来在程序中就可以直接判断的, 为啥还要等传到数据库插入时, 让服务器来判断次, 然后返回给程序? 程序到时候不一样需要处理么, 对数据来说, 它走了一堆弯路才知道走错了, 对服务器来说, 也加重了它的负担 就比如ABC三地连线呈三角形, 你直接可以走直线从A--B, 但是你偏偏要走 A--C--B , 弯远啦
在客户端程序中,我当然可以在程序里定义枚举,然后将对应的值存储在数据库中, 但问题是,如果我手动在SSMS里向数据库添加数据时,此时我想通过枚举值来限定输入的范围。
rfq 2015-06-05
  • 打赏
  • 举报
回复
表格 , 什么枚举 不能做
hery2002 2015-06-04
  • 打赏
  • 举报
回复
use AdventureWorks2012;
GO
--create
exec sp_addtype enum ,'char(1)', 'not null'
go
create table t 
(
a  enum  default('F') check(a  in ('T','F')),
)
go


--drop 
drop table t;
go
exec sys.sp_droptype enum;
go
  • 打赏
  • 举报
回复
其实枚举类型的本质 就是个 数字,所以 在程序中 进行限制 就可以了。 另外,sql server可以创建自定义类型,不过好像 不能做成 枚举类型
道玄希言 2015-06-04
  • 打赏
  • 举报
回复
虽然象5楼说的, 可以通过表外键约束来实现枚举类型的定义 但还是不建议在数据库中实现, 这部分用程序控制比较好了, 比如, 你一个超出枚举范围的项, 本来在程序中就可以直接判断的, 为啥还要等传到数据库插入时, 让服务器来判断次, 然后返回给程序? 程序到时候不一样需要处理么, 对数据来说, 它走了一堆弯路才知道走错了, 对服务器来说, 也加重了它的负担 就比如ABC三地连线呈三角形, 你直接可以走直线从A--B, 但是你偏偏要走 A--C--B , 弯远啦
江南小鱼 2015-06-03
  • 打赏
  • 举报
回复
还是去代码里面限制吧
还在加载中灬 2015-06-03
  • 打赏
  • 举报
回复
枚举应该放到程序里去做,一些数据的限制也应该放在程序中去限制
shoppo0505 2015-06-03
  • 打赏
  • 举报
回复
引用 6 楼 zfybs 的回复:
[quote=引用 5 楼 shoppo0505 的回复:] 枚举的类型完全可以用SQL表格来定义。 像你这个例子,需要3个表格来定义。 一个表格保存枚举类型1,数据比如: 1, A1 2,A2 … 一个表格保存枚举类型2,数据比如: 1, B1 2, B2 … 第三个表格的数据和你自己题目中的一样, Id是PK,B,C列用外键约束,然后表格上再添加constraint,来约束B,C列的允许值(不允许值)
那如果有很多个枚举类型的话,岂不是要建很多个表,而每一个表中都只有一列数据?[/quote] 如果是规范设计的话,必须是这样。 就像你用编成语言写程序,每个enum也必须各自定义啊。翻译成数据库语言,每个enum就是一个表格
zfybs 2015-06-03
  • 打赏
  • 举报
回复
引用 5 楼 shoppo0505 的回复:
枚举的类型完全可以用SQL表格来定义。 像你这个例子,需要3个表格来定义。 一个表格保存枚举类型1,数据比如: 1, A1 2,A2 … 一个表格保存枚举类型2,数据比如: 1, B1 2, B2 … 第三个表格的数据和你自己题目中的一样, Id是PK,B,C列用外键约束,然后表格上再添加constraint,来约束B,C列的允许值(不允许值)
那如果有很多个枚举类型的话,岂不是要建很多个表,而每一个表中都只有一列数据?
shoppo0505 2015-06-03
  • 打赏
  • 举报
回复
枚举的类型完全可以用SQL表格来定义。 像你这个例子,需要3个表格来定义。 一个表格保存枚举类型1,数据比如: 1, A1 2,A2 … 一个表格保存枚举类型2,数据比如: 1, B1 2, B2 … 第三个表格的数据和你自己题目中的一样, Id是PK,B,C列用外键约束,然后表格上再添加constraint,来约束B,C列的允许值(不允许值)
还在加载中灬 2015-06-03
  • 打赏
  • 举报
回复
不知道CHECK IN 约束,是不是你想要的

CREATE TABLE TTT123 (
ID INT CHECK(ID IN(1,2,3))
)
zfybs 2015-06-03
  • 打赏
  • 举报
回复
引用 1 楼 ky_min 的回复:
枚举应该放到程序里去做,一些数据的限制也应该放在程序中去限制
那如果不从枚举去考虑,我只想限制SQL SERVER中的某些单元格中的值的范围呢,有没有什么好的方法? 比如,我想将某一列的数据限制为 { "上"、"下"、"左"、"右" } 中的一个,而出现其他值就进行提示,或者能不能做到直接以列表框选择的方式给出这四项来。

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧