要求
- 实现客户信息、用水类型(类别号、类别名、水价)及业务员管理;
- 实现客户用水信息管理(客户号、月份、用水类别号、用水量);
- 实现客户费用管理(客户号、月份、费用、收费标志),收费标志的默认值为‘未收’;
- 实现收费登记(客户、月份、应收费用、实收费用、业务员),并自动修改收费标志(用触发器实现);
- 创建触发器,实现收费时自动更加应收费用和实收费用,计算本次结余,然后修改客户信息表中的结余金额;
- 创建存储过程统计指定月份应收费用和实收费用;
- 创建存储过程查询指定月份未交费的用户信息,以便催费;
- 创建规则使得月份符合格式“xxxx年xx月”,并绑定到表中相应字段;
- 建立表间关系
设计
思路
每个要求创建一个相应的表,建立联系,再根据具体需求选择增加或者删除表
我的理解是有这么几个要求:
- 客户信息
- 用水类型
- 业务员管理
这三个是基本信息表
- 用水信息管理
- 费用管理
- 收费登记
这三个是管理表,具体表中的属性题目中已经给出
由于要收费自动更加应收费用和实收费用,且要计算结余并更新,所以我选择增加一个表
- 订单管理
这样的话,整体的结构是这样的:
- 基本信息表用于建立客户、业务员以及水类的基本信息供管理表引用
- 用水信息管理负责进行水费的计算并赋给收费登记的应收费用(实现应收费用的自动更加)
- 订单管理负责将收取的费用赋给收费登记的实收费用(实现实收费用的自动更加)
- 收费登记负责统计应收费用和实收费用并进行比较用于确定结余金额以及是否已收费
根据以上思路,就能知道大概需要多少个触发器
- 用水信息管理需要一个
- 订单管理需要一个
- 收费登记需要至少一个
代码
首先是创建表(虽然这个应该都会,触发器里面用到局部变量需要格式相同我就一起写在这)
/* 由于方便自己看(中文不会一时宕机不记得这是什么表)就全部用中文建表了 */
DROP TABLE IF EXISTS 客户信息; /* 防止验证时候删除数据麻烦直接这里连表一起删除重建 */
DROP TABLE IF EXISTS 业务员信息;/* 目的是防止重复建表导致报错,如果只建一次表或者选择自己删除表内数据可以不用这几条语句 */
DROP TABLE IF EXISTS 用水类型;
DROP TABLE IF EXISTS 用水信息管理;
DROP TABLE IF EXISTS 收费登记;
DROP TABLE IF EXISTS 费用管理;
DROP TABLE IF EXISTS 订单管理;
CREATE TABLE 客户信息( /* 客户信息表 */
客户号 varchar(10),
客户名 varchar(10),
结余金额 float NOT NULL,
PRIMARY KEY(客户号)
)
CREATE TABLE 业务员信息( /* 业务员信息表 */
业务员号 varchar(10),
业务员名 varchar(10),
PRIMARY KEY(业务员号)
)
CREATE TABLE 用水类型( /* 用水类型表 */
类别号 varchar(10),
类别名 varchar(10),
单位水价 float NOT NULL,
PRIMARY KEY(类别号),
)
CREATE TABLE 用水信息管理( /* 用水信息管理表 */
客户号 varchar(10) references 客户信息(客户号),
月份 varchar(20),
用水类别号 varchar(10) references 用水类型(类别号),
用水量 float,
PRIMARY KEY (客户号,月份)
)
CREATE TABLE 收费登记( /* 收费登记表 */
客户号 varchar(10) references 客户信息(客户号),
月份 varchar(