VerySource

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

能不能在check 上加子查询来限制check的条件。帮忙,

[复制链接]

2

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-11 10:00: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
但是接下去的:
alter table 学生论文实习

add constrain check (count(学生论文实习.学号=助教_学生(学号))〈10)
总是不对
请高人指教```
回复

使用道具 举报

2

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-1-21 21:00:01 | 显示全部楼层
等侍中~~~~~~~~~~
回复

使用道具 举报

0

主题

6

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-8-18 23:15:02 | 显示全部楼层
你的业务逻辑检查的共同点都是根据另外一张表的某一列的值来检查本表的某一列的数据是否符合业务逻辑,这种业务逻辑的约束问题可以有以下两个解决办法:
1. 使用一个用户自定义的函数,在这个自定义的函数里使用子查询检查其他表的值,然后定义一个约束,并在约束中引用你的用户自定义函数。
2. 用触发器来实现你的业务约束。
通常,用触发器解决是一种更简单直接,逻辑上更自然的方式。
回复

使用道具 举报

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

本版积分规则

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

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