VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 595|回复: 2

加子查询来限制check的条件

[复制链接]

2

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-17 07:20:01 | 显示全部楼层 |阅读模式
该数据库主要实现对毕业生毕业设计情况的管理,具体内容包括对学院、学生、实习单位、实习项目及实习指导教师的管理。学生作毕业设计分为校内实习和校外实习,要记录的信息有:
3.学生基本情况:学号、姓名、性别、年龄、专业、籍贯、实习单位(校内实习的学生此项为空)……
4.实习单位情况:单位编号、单位名称、联系电话、通信地址、邮编……
5.论文选题情况:论文题目、要求……
6.校内实习导师:教师编号、姓名、性别、系别、职称、职务……
7.校外实习导师:员工编号、姓名、性别、部门、职称、职务……

如下限制:一位教师指导学生人数不得超过10人;职称不到副教授、教授级别的教师只能指导本专业学生;职称不到讲师级别的教师只能指导校外实习学生。

以下是我写的表
学生实体转换成‘学生’表
列名数据类型     键、约束和默认

学号 int        主键
姓名 varchar(20)
姓别 char(2)
年龄 tinyint
专业 char
籍贯 varchar(50)
论文ID int    外键:参照‘论文’表的论文ID是否校外默认是0 


公司实体转换成‘学习单位’表
列名数据类型      键、约束和默认

单位ID int       主键
名称  varchar(50)
电话  varchar(30)
地址  varchar(50)
邮编int


教师实体转换成‘校内导师’表
列名数据类型  键、约束和默认

教师ID int  主键
姓名  varchar(20)
姓别  char(2)
系别  char
职务  char
职称  char



员工实体转换成‘校外导师’表
列名数据类型   键、约束和默认

员工ID int     主键
姓名  varchar(20)
姓别  char(2)
部门  varchar(50)
职务  char
职称  char
单位ID int  外键:参照‘学习单位’表的‘单位ID’


论文实体转换成‘论文’
列名数据类型  键、约束和默认

论文ID  int主键
论文题目 varchar(50)



‘学生论文实习’表。
列名数据类型  键、约束和默认

学号  int  主键:参照‘学生’表的‘学号’
员工ID int  外键:参照‘校外导师’表的‘员工ID’
教师ID int  外键:参照‘校内导师’表的‘教师ID’
单位ID int  外键:参照‘学习单位’表的‘单位ID’

想在‘学生论文实习’表。中加一个限制,让职称=‘助教’的,只能指导10个本系的学生。constrain上的check 是不能加子查询来限制check的条件。想请教还有什么更好的方法,
我的做法是在视图上把,合条件的选出来,
alter view 助教_学生(学号)
as
select 学生论文实习.学号
from 学生论文实习,学生,校内导师
where( 学生.专业=校内导师.系别 and 校内导师.系别='助教' and 学生.学号=学生论文实习.学号 and 学生论文实习.教师ID=校内导师.教师ID)

go
但是接下去的:是要用check来限制还是用存储过程来控制呢?
还是有哪种更好的方法,修改数据库的设计就能实现的呢?
想不通了~~~~~~~~~
请高人指教```

回复

使用道具 举报

0

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-1-22 09:00:01 | 显示全部楼层
个人感觉SQL SERVER错误机制很糟糕,也难以捕捉,所以能不用约束,尽量不用约束.
大部份人是不会用check的.宁可用前台程序,或存储过程处理.

用程序来约束处理,如有修改或程序发布后维护也比较方便.
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-23 14:54:01 | 显示全部楼层
可以考虑用触发器,如果你仅仅就是为了CHECK

一般的CHECK没必要支持子查询,如果真支持,那么效率也太底
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表