文章目录

  • 任务
  • 过程
    • 随机身份数据
      • CREATE TABLE Resident
      • python代码打印SQL语句
      • 实现结果
    • 医生信息
      • CREATE TABLE Doctor
      • 导入数据
        • “升职”
        • “排班”
      • 最终结果
    • 患者信息
      • CREATE TABLE Patient
    • 消费记录
      • CREATE TABLE Tally
    • 患者操作
      • 注册
        • CREATE PROC proc_register
        • 实现展示
      • 充值
        • CREATE PROC proc_deposit
        • 实现展示
      • 消费
        • CREATE PROC proc_charge
      • 注销
        • CREATE PROC proc_logout
        • 实现展示
  • 总结

任务

接上篇:数据库课设项目(上) 医院。本篇完成需求中的医护人员与患者信息与活动。
最终会将完整项目代码上传至GitHub仓库。

过程

随机身份数据

为了快速将数据导入数据库中测试代码效果,在GitHub上找到随机生成身份信息的项目:https://github.com/gh0stkey/RGPerson,是python代码,运行效果如下:

这里要推荐一下运行python代码的利器JupyterLab, 之前简单写了一下基本的使用方法:JupyterLab入门应用
我们查看一下主函数:

if __name__ == '__main__':    age = random.randint(16,60) #可调整生成的年龄范围(身份证),这边是16-60岁gender = random.randint(0,1)sex = u"男" if gender == 1 else u"女"print("姓名: {0}\n年龄: {1}\n性别: {2}\n身份证: {3}\n手机号: {4} {5}\n组织机构代码: {6}\n统一社会信用代码: {7}\n单位性质: {8}".format(genName(), age, sex, genIdCard(age, gender), list(genMobile().keys())[0], list(genMobile().values())[0], genOrgCode(), list(genCreditCode().keys())[0], list(genCreditCode().values())[0]))

那我们就可以根据这个随机生成的信息建表,如下:

CREATE TABLE Resident

CREATE TABLE Resident(
姓名 nvarchar(20)  NULL,
年龄 tinyint NULL CONSTRAINT cc_age CHECK( 年龄>0 and 年龄<120) ,
性别 nvarchar(4)  NULL,
身份证 char(18) NOT NULL,
手机号 char(11)  NULL,
运营商 varchar(20)  NULL,
组织机构代码 varchar(40)  NULL,
统一社会信用代码 varchar(20)  NULL,
单位性质 nvarchar(20)  NULL,
CONSTRAINT pk_resident PRIMARY KEY( 身份证)
)

python代码打印SQL语句

为了方便插入数据,我们一方面通过循环获取多条随机身份信息;另一方面直接以SQL语句的格式输出,便可以直接通过复制粘贴放到SQL中执行。修改后的主函数如下:

if __name__ == '__main__':
for i in range(1000):age = random.randint(16,60) #可调整生成的年龄范围(身份证),这边是16-60岁gender = random.randint(0,1)sex = u"男" if gender == 1 else u"女"print("INSERT INTO Resident VALUES ('{0}',{1} ,'{2}','{3}','{4}','{5}','{6}','{7}','{8}')".format(genName(), age, sex, genIdCard(age, gender), list(genMobile().keys())[0], list(genMobile().values())[0], genOrgCode(), list(genCreditCode().keys())[0], list(genCreditCode().values())[0]))

打印结果如下:

此外,为符合医疗场景,我们将单位性质生成函数作如下修改,把原本为其他的一些条目改为医护工作者

实现结果

最终导入数据库中执行语句如下:

医生信息

CREATE TABLE Doctor

doctor (ID, position, workday,hospitalName, workDeptName,directDeptNumber)

CREATE TABLE Doctor
(
ID char(18) NOT NULL ,
position nvarchar(20) NULL,
workday nvarchar(20) NULL,
hospitalName nvarchar(40) NOT NULL ,
workDeptNumber int NOT NULL,
directDeptNumber int NULL, CONSTRAINT pk_doctor PRIMARY KEY(ID,workDeptNumber,hospitalName),CONSTRAINT fk_doctor_ID FOREIGN KEY(ID)REFERENCES Resident(身份证) ON DELETE CASCADE,CONSTRAINT fk_doctor_workDept FOREIGN KEY(workDeptNumber,hospitalName)REFERENCES Department(number,hospitalName) ON DELETE CASCADE
)
GO

导入数据

为简化过程,我们把此数据库中所有的医护工作者都分配到同一家医院。并采用随机函数rand()将他们随机分配至不同科室。

INSERT INTO Doctor (ID ,position,hospitalName,workDeptNumber)
SELECT 身份证,substring(单位性质,4,len(单位性质)),hospitalName,number
FROM Department ,Resident
WHERE
hospitalName='河北大学附属医院' and
convert(int,substring(身份证,10,3))%11+1=number and
单位性质 like '医院%'

“升职”

我们默认主任医师都是所在科室的管理者

UPDATE Doctor SET directDeptNumber=workDeptNumber
WHERE position='主任医师'

“排班”

设定几个工作时间,用临时表存储,通过随机函数安排!

CREATE TABLE #workday
(
code int IDENTITY PRIMARY KEY,
workday nvarchar(20)
)
INSERT INTO #workday VALUES( '一、三、五'),( '二、四、六'),('三、日'),('四、日')
UPDATE Doctor SET workday=#workday.workday
FROM Doctor,#workday
WHERE
convert(int,substring(ID,10,3))%4+1=code

最终结果

患者信息

CREATE TABLE Patient

Patient( ID ,hospitalName, 卡号 ,注册时间)

CREATE TABLE Patient
(
ID char(18) NOT NULL ,
hospitalName nvarchar(40) NOT NULL,
卡号 nvarchar(40) NULL,
注册时间 datetime default getdate(),
CONSTRAINT pk_patient PRIMARY KEY(ID,hospitalName),
CONSTRAINT fk_patient_ID FOREIGN KEY(ID)REFERENCES Resident(身份证) ON DELETE CASCADE,
CONSTRAINT fk_patient_hospital FOREIGN KEY(hospitalName)REFERENCES Hospital(医院名称) ON DELETE CASCADE
)

消费记录

CREATE TABLE Tally

Tally( hospitalName(医院) ,卡号 ,金额 ,时间, departmentNumber(柜台:充值处/科室))

CREATE TABLE Tally
(
hospitalName nvarchar(40) NOT NULL,
卡号 nvarchar(40) NOT NULL,
金额 money NULL,
时间 datetime default getdate(),
departmentNumber int NOT NULL,
CONSTRAINT pk_tally PRIMARY KEY(departmentNumber,hospitalName,卡号,时间),
CONSTRAINT fk_tally_department FOREIGN KEY(departmentNumber,hospitalName)REFERENCES Department(number,hospitalName) ON DELETE CASCADE,
)

患者操作

如之前所述,我们通过存储过程 PROCEDURE实现,其实与编程语言中的函数概念相似,一旦生成,可以反复调用。
存储过程例题分析:数据库每日一题 (4)存储过程

注册

CREATE PROC proc_register
/**************注册******************/
--提供个人姓名与身份证号与所在医院即可注册(选取Resident表中的数据)
CREATE PROC proc_register
@name nvarchar(20),
@ID char(18),
@hospitalName nvarchar(40)
AS
SET nocount ON --不返回计数
BEGINif exists(SELECT * FROM Resident WHERE 身份证=@ID and 姓名=@name)BEGINif exists(SELECT * FROM Patient WHERE ID=@ID)print @ID+'already registered'else  BEGINDECLARE @hospitalNumber intSELECT @hospitalNumber=ROW_NUMBER() over(order by 医院名称 desc)FROM HospitalINSERT INTO Patient(ID,hospitalName,卡号)VALUES(@ID,@hospitalName,convert(nvarchar(4),@hospitalNumber)+@ID)ENDEND
END
实现展示
SELECT * FROM Patient
EXECUTE proc_register '郝掂','340321196507203290','河北大学附属医院'
SELECT * FROM Patient

充值

我们默认充值是从收费部进行,通过字符匹配找到相应的部门编号。WHERE hospitalName=@hospitalName and name like '%费%' or name like '%值%'

CREATE PROC proc_deposit
CREATE PROC proc_deposit
@hospitalName nvarchar(40),
@cardNumber nvarchar(40),
@money money
AS
SET nocount ON --不返回计数
BEGINif exists (SELECT * FROM Patient WHERE 卡号=@cardNumber) BEGINDECLARE @departmentNumber intSELECT @departmentNumber=number FROM departmentWHERE hospitalName=@hospitalName  andname like '%费%' or name like '%值%'--  SELECT @departmentNumberINSERT INTO Tally(hospitalName,卡号,金额,departmentNumber) VALUES(@hospitalName,@cardNumber,@money,@departmentNumber)END
END
实现展示
SELECT * FROM TALLY
EXECUTE proc_deposit '河北大学附属医院','5340321196507203290',100
SELECT * FROM TALLY

消费

消费与充值基本一致,只是需要提供消费的部门名称

CREATE PROC proc_charge
CREATE PROC proc_charge
@hospitalName nvarchar(40),
@cardNumber nvarchar(40),
@money money,
@departmentName nvarchar(20)
AS
SET nocount ON --不返回计数
BEGINif exists (SELECT * FROM Patient WHERE 卡号=@cardNumber) BEGINDECLARE @departmentNumber intSELECT @departmentNumber=number FROM departmentWHERE hospitalName=@hospitalName  andname = @departmentName --  SELECT @departmentNumberINSERT INTO Tally(hospitalName,卡号,金额,departmentNumber) VALUES(@hospitalName,@cardNumber,@money,@departmentNumber)END
END
GO

注销

注销就相对简单,提供必要的信息,删除注册记录。

CREATE PROC proc_logout
CREATE PROC proc_logout
@name nvarchar(20),
@ID char(18),
@hospitalName nvarchar(40)
AS
SET nocount ON --不返回计数
BEGINif exists(SELECT * FROM Resident WHERE 身份证=@ID and 姓名=@name)BEGINDELETE FROM PatientWHERE ID =@ID andhospitalName=@hospitalNameEND
END
GO
实现展示
SELECT * FROM PATIENT
EXECUTE proc_logout'郝掂','340321196507203290','河北大学附属医院'
SELECT * FROM PATIENT

总结

就此,基本的需求完成。接下来可以做的:

  1. 将代码整合起来统一运行,之前看到的一篇文章会有帮助:使用SQLCMD在SQLServer执行多个脚本
  2. 通过ODBC接口将SQL语句与编程语言(python等)关联,实现仿真交互

数据库课设项目(下) 医护人员与患者相关推荐

  1. 数据库课设项目(上) 医院

    文章目录 任务 需求分析 过程 CREATE DATABASE 导入地区数据 转义字符 CREATE TABLE 成功导入 注册医院 CREATE TABLE 导入结果 触发器创建默认科室 初始科室 ...

  2. 数据库课设(足球联赛管理系统)

    一:前言 如果有关注博主的粉丝,可能会发现贴心杰又缺更好几天了,但是我是宠粉杰啊,怎么可能会忘了我的宝贝粉丝呢,只不过是临近期末,各种大作业课设如期而至,这几天我在写数据库课设,对于一个没有写过任何项 ...

  3. HNUST - 数据库课设

    HNUST - Python+Mysql数据库课设 一.实验题目 人事管理系统 二.实验目的 企业人事管理系统主要用于员工个人资料的录入.职务变动的记录和管理.使用人事管理系统,便于公司领导掌握人员的 ...

  4. Java毕业课设项目名称

    Java毕业课设项目名称 毕业设计题目 1 网上校友录设计 2 辅导员之家网站设计与开发 3 B/S结构下的OA流程可视化的研究与实现 4 B2C的电子商务系统(J2EE) 5 C/S架构的在线开始系 ...

  5. 数据库课设记录 Day 3

    Day 3 经过各种斟酌,砍了不少一时心血来潮想做的东西,数据库课设的核心内容就定下来了. 公司 Company 名称 字段 数据类型 id id int 公司名 name varchar(20) 地 ...

  6. JAVA+MySQL 数据库课设的问题及解答的整理 以【学生管理系统】为例

    JAVA+MySQL 数据库课设的问题及解答的整理 以[学生管理系统]为例.帅气学长哦! 编写这篇博文初衷 MySQL的一些问题 Eclipse导入项目的一些问题 数据库的建立和连接 最后一步 编写这 ...

  7. 临近期末,图书管理系统课设项目安排上(附源码)

    图书管理系统 项目介绍 项目截图 源码分享 项目介绍 本系统是一个基于java的图书管理系统,用Swing显示信息. 开发环境为IDEA,使用mysql数据库.用 户分为 用户和管理员. 项目截图 源 ...

  8. 微机原理实验8254计算机钢琴,GitHub - SincereXIA/PianoMFC: 西电微机原理课设项目,键盘电子乐器演奏程序设计(电子琴),MFC...

    PianoMFC 西电微机原理课设项目,键盘电子乐器演奏程序设计(电子琴),MFC 需要连接西电微机原理实验室提供的 QTH9054 微机试验箱,使用其蜂鸣器发声,若不连接,程序会直接播放 mp3 文 ...

  9. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

最新文章

  1. 【Mac】解决「无法将 chromedriver 移动到 /usr/bin 目录下」问题
  2. python smtp模块发送邮件
  3. Android之自定义Adapter的ListView
  4. 2019支持c99吗_德国LYNX携手北京十方融科科技有限公司成功中标2019年中国联通北京市分公司4K超高清视频信号传输设备购置项目...
  5. go给Linux安装mysql_Linux安装MySQL-Go语言中文社区
  6. Win10系列:C#应用控件基础12
  7. 支票数字大写转换器_信用卡支票数字生成器Java程序
  8. 在VirtualBox中安装WindowsXP
  9. 二进制搜索树(BSTs) 和AVL 树
  10. 怎样才能写好一份高质量的市场需求文档(MRD)
  11. oracle 转chr,[Oracle]Oracle之Chr函数返回
  12. cad解除块的快捷命令_CAD解除编组及快捷键命令
  13. vue页面详情页返回列表页_vue 详情页返回列表页,保留列表页之前的筛选条件...
  14. 北京交通大学万怀宇:时空交通数据预测方法及应用
  15. PHP 面试总结(持续更新) --小丑
  16. Kubeadm 部署企业级高可用Kubernetes(适用于ECS)
  17. 1567. 乘积为正数的最长子数组长度 ●●
  18. Java构建HashCode相同字符串算法
  19. web前端面试--浏览器兼容性问题
  20. 基于FPGA音乐播放器硬件电路设计

热门文章

  1. MPLS 虚拟专用网络 Hub and Spoke实验
  2. 马斯克大举提拔华裔,引发华裔与印度裔哪个更具优势的争论
  3. h5页面在iphone手机上底部会有留白解决办法
  4. vim设置编码为urf-8
  5. Visual Studio 2015安装的Visual Studio Installer生成的msi兼容XP系统
  6. AI时代的招聘新趋势:数字化人才Mapping
  7. decode.c:38:18: fatal error: dnet.h: No such file or directory
  8. EOMS未完成工单统计及催单短信自动生成工具
  9. python小海龟画小汽车
  10. uc支持html5么,新版UC浏览器对HTML5支持度简析