JavaSwing+MySQL的物业管理系统

点击以下链接获取源码:
https://download.csdn.net/download/qq_64505944/88081588?spm=1001.2014.3001.5503
在这里插入图片描述

JDK1.8、MySQL5.7

《数据库应用系统》课程设计报告

题 目: 居民小区物业管理系统的设计与实现
在这里插入图片描述

在这里插入图片描述

目录
1 引言 1
2 系统需求描述 1
2.1 业务需求 1
2.2 数据需求 2
3 系统设计 3
3.1 应用程序设计 3
3.2 数据库设计 4
3.2.1 概念设计 4
3.2.2 逻辑设计 4
4 系统实现 8
4.1 应用程序界面设计、编码 8
4.2 数据库对象实现 15
5 总结 21

1引言
在电子计算机技术发展日新月异的今天,计算机软件的应用早已深入到了各行各业,并发挥着它们巨大的潜力。随着企业,房户等一系列的改革,一切都在潮向社会化发展,管理体制也由过去的“全承包”向现在的“一体化,专门化”发展。为了人员的安全,社会的稳定,国家的持续发展,物业管理在起着举足轻重的作用。本物业管理系统提供对人员,住房,房产和收费信息的管理。本系统具有一定的实用性。
本物业管理系统基于512GB PC机环境下,采用MySQL数据库管理系统,在MySQL数据库管理系统下建立estate数据库,建立了一系列数据管理表。然后在IDEA软件下使用Java语言,运用Java Swing技术开发用户程序,使用JDBC实现数据库中数据与用户界面的交互,极大地方便了用户使用和管理数据。
2系统需求描述
2.1业务需求
本系统业务需求提供五个大模块,即权限管理、物业信息维护管理、物业收费系统管理、费用报表输出管理以及历史记录查询。
权限管理模块包含用户个人信息查询和添加用户功能,用户信息查询可以给用户提供展示自己的用户名和密码;添加用户信息可为用户注册新的登录账号和密码,并存储到数据库中,用户就可以使用新添加的账号和密码进行登录。
物业信息维护模块提供物业信息维护和收费单价两个功能,其中物业信息维护中有小区信息维护,该功能可以查看小区的基本信息,通过小区编号、名称、地址和占地面积等属性可添加、修改、删除相关小区信息。楼宇信息维护功能提供按照小区名称、小区编号、楼宇编号、楼宇层数、产权面积、楼宇高度以及楼宇的类型和楼宇的使用状态等能够添加新的楼座信息,通过编号查询到相关楼座的其他详细信息,能够修改楼座的其他信息,能偶对不想要的楼座信息从数据库中进行删除。访问信息维护可按照房屋主人的姓名查询到该业主房屋其他相关属性信息,可修改每个属性,可增加可删除房屋记录信息。收费单价功能提供对物业中收费项目以及单价的查询,也可以增加、修改、删除一些物业收费项目。
物业收费录入模块中提供业主电表/水表/煤气表读数的录入功能,第一个是针对业主房屋实现的,通过选择想要录入的小区,在这些小区下选择楼宇可录入输入时间,录入格式为YYYYMM,在该楼宇下给指定的房屋编号添加水表读数、电表读数和煤气表读数。第二个是针对公共表的实现,该功能只提供选择所在小区即可添加相关数据,可登记某小区的电梯电表、楼道照明电表、总水表、总电表和二次供水电表等信息。
报表输出模块中提供电费收费报表、水费收费报表、煤气费收费报表、用户收费报表和总物业收费报表,用户只需要选择相应小区、相应小区所在相应楼宇即可查询到对应的报表,主要涉及到该楼宇上个月读数和这个月读数,系统自动结算出用户应缴总额。
历史记录查询模块提供按月份查询、按楼宇查询、按小区查询以及按业主查询。按照不同查询方式可分别查询到小区对应的电梯费用总报表、楼道照明电费总报表以及二次供水费用报表,对应业主用户查询到某个月的水费、电费、煤气费各项费用报表。
2.2数据需求
用户登录模块与权限管理模块中应该有用户名,用户密码属性。物业信息维护模块中小区信息维护功能涉及到小区编号、小区名称、小区地址以及小区占地面积等属性。楼宇信息维护可能拥有小区名称、小区编号、楼宇编号、楼宇层数、产权面积、楼宇高度以及楼宇的类型和楼宇的使用状态等属性信息。房屋信息维护功能除了上述属性外还增加了房间号、房屋的用途、业主姓名、业主性别、业主身份证号、联系地址和联系电话属性。物业收费项目涉及到收费项目编号、收费项目名称以及项目单价等属性。
物业收费录入模块应该拥有录入日期、水表读数、电表读数和煤气表读数等数据,其中公共电表/水表的录入涉及到电梯电表、楼道照明电表、总水表、总电表和二次供水电表等信息。
报表输出模块涉及到对应表的上月读数和当月读数以及自动结算出来的应缴总额字段。
3系统设计
3.1应用程序设计
本系统采用Java Swing设计的窗体应用程序,总体包含5大功能模块,即权限管理、物业基本信息、物业收费录入、报表输出以及历史记录查询功能,其各个功能结构及其与其他功能关系设计如图1所示。

图1 功能结构及其功能关系图
系统所有功能类及其类间关系设计总体结构如图2所示。

图2 类及其类间关系总体设计
3.2数据库设计
3.2.1概念设计
根据本系统中需求描述设计出本系统的概念模型,系统总体数据概念模型如图3所示。

图3 系统E-R图设计
3.2.2逻辑设计
根据逻辑设计阶段设计出的E-R模型进行逻辑设计,转换为关系模式如表1所示。
其中小区实体及其对应属性转换关系模式为:
小区信息(小区编号,小区名字,小区地址,小区占地面积),小区编号为主键
小区信息关系模式字段说明如表1所示。
表1 小区实体关系模式
字段名称 数据类型 可否为空 字段描述 其他说明
District_id Smallint(6) NOT NULL 小区编号 主键,默认0
District_name Varchar(12) NOT NULL 小区名称 默认
Address Varchar(60) NOT NULL 小区地址 默认
Floor_space double NOT NULL 小区占地面积 默认

楼宇实体及其对应属性转换为关系模式为:
楼宇(楼宇编号,楼宇层数,产权面积,楼宇高度,类型,楼宇状态,小区编号),楼宇编号为主键,小区编号为外键。
楼宇信息关系模式字段如表2所示。
表2 楼宇实体关系模式
字段名称 数据类型 可否为空 字段描述 其他说明
District_id Smallint(6) NOT NULL 小区编号 外键,默认0
Building_id Smallint(6) NOT NULL 楼宇编号 主键,默认0
Total_storey Smallint(6) NOT NULL 楼宇总层数 默认0
Total_area Double NOT NULL 楼宇产权面积 默认0
Height Double NOT NULL 楼宇高度 默认0
Type Smallint(6) NOT NULL 楼宇类型 默认0
Status Varchar(9) NOT NULL 楼宇状态 默认

业主和房屋两个实体以及他们的属性合并到一起构成新的关系模式为:
房屋(房间编号,业主身份号,产权面积,房屋状态,用途,业主名字,性别,地址,电话,小区编号,楼宇编号),房间编号和业主身份证号构成主键,小区编号,楼宇编号是外键。
房屋信息关系模式字段如表3所示。
图3 房屋信息关系模式
字段名称 数据类型 可否为空 字段描述 其他说明
District_id Smallint(6) NOT NULL 小区编号 外键,默认0
Building_id Smallint(6) NOT NULL 楼宇编号 外键,默认0
Room_id Smallint(6) NOT NULL 房间编号 主键,默认0
Area Double NOT NULL 产权面积 默认0
Status Varchar(9) NOT NULL 房屋状态 默认
Purpose Varchar(10) NOT NULL 房屋用途 默认
Oname Varchar(20) NOT NULL 房主姓名 默认
Sex Varchar(7) NOT NULL 房主性别 默认
Id_num Varchar(18) NOT NULL 房主身份证号 主键,默认
Address Varchar(60) NOT NULL 房主联系地址 默认
Phone Double NOT NULL 房主电话 默认0

收费项目实体转为关系模式为:
收费项目(收费项目编号,收费项目名称,收费单价),收费项目编号为主键。
收费项目关系模式字段如表4所示。
表4 收费项目关系模式
字段名称 数据类型 可否为空 字段描述 其他说明
Char_id Smallint(6) NOT NULL 收费项目编号 主键,默认0
Charge_name Varchar(20) NOT NULL 收费项目名称 默认
Unit_price Double NOT NULL 项目收费单价 默认0

业主房间与收费项目的联系房屋电费及属性转换为关系模式为:
业主用量(房间号,日期,水表读数,电表读数,煤气表读数,小区编号,楼宇编号),房间号,日期为主键,小区编号,楼宇编号为外键。
业主用量关系模式字段如表5所示。
表5 业主用量关系模式字段
字段名称 数据类型 可否为空 字段描述 其他说明
Room_id Smallint(6) NOT NULL 房间号 主键,默认0
Date Int(11) NOT NULL 日期 默认0
Diatrict_id Smallint(6) NOT NULL 小区编号 外键,默认0
Building_id Smallint(6) NOT NULL 楼宇编号 外键,默认0
Water_reading Double NOT NULL 水表读数 默认0
Elec_reading Double NOT NULL 电表读数 默认0
Gas_reading Double NOT NULL 煤气表读数 默认0

楼宇与收费单价表之间的联系楼宇电费转为关系模式为:
楼宇电费(楼宇编号,日期,电梯表读数,楼道照明表读数,小区编号),楼宇编号为主键,小区编号为外键。
楼宇电费关系模式字段如表6所示。
表6 楼宇电费关系模式
字段名称 数据类型 可否为空 字段描述 其他说明
Diatrict_id Smallint(6) NOT NULL 小区编号 外键,默认0
Building_id Smallint(6) NOT NULL 楼宇编号 主键,默认0
Date Int(11) NOT NULL 日期 默认0
Lift_ele_reading Double NOT NULL 电梯电表读数 默认0
Lighting_reading Double NOT NULL 楼道照明电表读数 默认0

房主房间总电费转换为关系模式为:
房间费用(房间号,起始时间,终止时间,总费用,小区编号,楼宇编号),房间号,起始时间,终止时间为主键,小区编号,楼宇编号为外键。
房间费用关系模式如表7所示。
表7 房间费用关系模式字段
字段名称 数据类型 可否为空 字段描述 其他说明
Room_id Smallint(6) NOT NULL 房间号 主键,默认0
Diatrict_id Smallint(6) NOT NULL 小区编号 外键,默认0
Building_id Smallint(6) NOT NULL 楼宇编号 外键,默认0
Date datetime NOT NULL 起始日期 默认
Deadline Datetime NOT NULL 结束时间 默认
Total_fee Double NOT NULL 总费用 默认0

小区与收费单价表之间的联系小区电费表的关系模式为:
小区费用(小区编号,日期,总水量,总电量,二次供应电量),小区编号为主键。
小区费用关系模式字段如表8所示。
表8 小区费用关系模式
字段名称 数据类型 可否为空 字段描述 其他说明
Diatrict_id Smallint(6) NOT NULL 小区编号 主键,默认0
Dae Int(11) NOT NULL 日期 默认0
Tot_water_reading Double NOT NULL 总水量 默认0
Tot_elec_reading Double NOT NULL 总电量 默认0
Sec_supply_reading Double NOT NULL 二次供应总电量 默认0
4系统实现
4.1应用程序界面设计、编码
(1)登录界面
本系统通过用户使用用户名和密码进行登录,系统通过调用数据库中用户信息来进行校验用户输入的账号和密码是否成功。其登录界面设计如图4所示。调用数据库关键代码如下。
1.Try {
2. connection = DBConnection.getConnection();
3. String sql = “select * from login_info”;//查询数据库中的登录信息表
4. statement = connection.prepareStatement(sql);
5. ResultSet result = statement.executeQuery();
6. while (result.next()) {
7. if (user.compareTo(result.getString(“uname”)) == 0 && pwd.compareTo(result.getString(“paswrd”)) == 0) {
8. System.out.println(user + “:” + pwd);
9. found = true;//登录成功
10. //调用InterfaceStyle类显示主界面
11. InterfaceStyle.mainFrame(user, result.getInt(“purview”));
12. Login.this.setVisible(false);
13. }
14. }
15. if (!found) {
16. JOptionPane.showMessageDialog(null, “用户名或密码错误,请重输”, “错误”, JOptionPane.ERROR_MESSAGE);
17. nameText.setText(“”);
18. passField.setText(“”);
19. }

图4 系统登录界面

(2)主界面
本系统主界面包含了权限管理、基本物业信息、物业收费录入、报表输出以及历史记录查询等主要模块功能,其各模块下的子功能见主界面的左侧展示,也可依次点开菜单栏进行查询,系统主界面设计如图5所示。

图5 系统主界面

(3)小区信息维护
小区信息维护可查询小区的各项信息,可根据输入框填入小区信息进行新增加一些小区,也可修改和删除,输入验证操作有弹框提示,这里进行输入演示,小区编号:8,小区名称:郑州大学,小区地址:河南省郑州市高新区,占地面积:20000,演示界面如图6所示。小区信息维护的关键代码如下。
1.String sql3 = “select * from district_info”;
2. rSet = statement.executeQuery(sql3); //执行查询SQL语句
3. if (rSet.next() == true) {
4. String sql = “select * from district_info”;
5. ResultSet rs = statement.executeQuery(sql);
6. vector.removeAllElements(); //清空表格
7. tm.fireTableStructureChanged();
8. while (rs.next()) { //对结果集遍历
9. Vector rec_vector = new Vector(); //创建小区内容集合
10. rec_vector.addElement(rs.getString(1)); //获取小区编号
11. rec_vector.addElement(rs.getString(2)); //获取小区名称
12. rec_vector.addElement(rs.getString(3)); //获取小区地址
13. rec_vector.addElement(rs.getString(4)); //获取占地面积
14. vector.addElement(rec_vector); //添加到表格信息集合
15. }
16. tm.fireTableStructureChanged();
17. }

图6 小区信息维护

(4)收费单价
收费单价功能包含修改收费单价和显示收费单价功能,其中修改收费单价功能可根据需求新增或者删除收费项,其中修改收费单价界面如图7所示,显示收费单价核心代码如下。
1.while (rsl1.next()) { //遍历结果集
2. Vector currentRow = new Vector(); //创建收费信息集合
3. for (int i = 1; i <= rsmd1.getColumnCount(); ++i) {
4. currentRow.addElement(rsl1.getString(i)); //添加信息
5. }
6. rows.addElement(currentRow); //保存到集合中
7.}
8.display = new JTable(rows, columnName);

图7 修改收费单价

(5)物业收费录入
物业收费录入功能包含业主水表/电表/煤气表的读数录入,公共电表/水表读入录入,其中业主水表/电表/煤气表的读数录入通过选择小区,选择对应小区下的楼宇进入到房间页面,针对对应房间号进行数据读数,依次读入读表日期、水表、电表、煤气表,读数录入如图8所示,物业收费录入核心代码如下。
1.uptownselect.addItemListener(new ItemListener() { // 选择事件
2. public void itemStateChanged(ItemEvent event) {
3. int i = 0;
4. i = uptownselect.getSelectedIndex(); // 获取选中小区
5. t++;
6. getbuilding(uptownid[i]); // 获取该小区的楼宇
7. if (t < 2) {
8. MonthDataInputFrame mdif2 = new MonthDataInputFrame(
9. uptownname[i], uptownid[i], type);
10. }
11. MonthDataInputFrame.this.setVisible(false);
12. }
13. });
14. public void actionPerformed(ActionEvent event) {
15. date_in = datefield.getText();
16. for (int k = 0; k < roomcount; k++) {
17. water[k] = waterfield[k].getText();
18. ele[k] = elefield[k].getText();
19. gas[k] = gasfield[k].getText();
20. }
21. nullvalue = judgenull(water, ele, gas, date_in);
22. if (nullvalue == 0) {
23. MonthDataOperate operate = new MonthDataOperate(
24. in_uptown, in_building, roomid, water, ele,
25. gas, date_in, roomcount);
26. } else {
27. message2 = “有空值,请输入完整”;
28. JOptionPane.showMessageDialog(null, message2,
29. “Error”, JOptionPane.PLAIN_MESSAGE);
30. }
31. }

图8 物业收费录入

(6)报表输出
报表输出功能包含水费/电费/煤气费收费报表以及用户收费报表、总物业收费报表,其中以电费收费报表为例,通过选择小区,选择该小区下对应的楼宇就可以查看到对应房间电费报表的所有信息,电费收费报表如图9所示,电费收费报表功能核心代码如下所示。
1.sql3= “select r.district_id,r.building_id,r.room_id,r.oname,r.purpose,ur1.water_reading,ur2.water_reading from room_info r,user_reading ur1,user_reading ur2 where r.district_id=”
2. + did
3. + " and r.district_id=ur1.district_id and ur1.district_id=ur2.district_id and r.building_id="
4. + bid
5. + " and r.building_id=ur1.building_id and ur1.building_id=ur2.building_id and r.room_id=ur1.room_id and ur1.room_id=ur2.room_id and ur1.date="
6. + (time - 1) + " and ur2.date=" + time; //查询SQL语句
7. rSet = statement.executeQuery(sql3);
8. if (rSet.next() == true) {
9. String sql = sql3;
10. ResultSet rs = statement.executeQuery(sql);
11. vector.removeAllElements();
12. tm.fireTableStructureChanged();
13. while (rs.next()) { //对结果集遍历
14. Vector rec_vector = new Vector(); //信息集合
15. rec_vector.addElement(String.valueOf(rs.getInt(1))); //小区号
16. rec_vector.addElement(String.valueOf(rs.getInt(2))); //楼号
17. rec_vector.addElement(String.valueOf(rs.getInt(3))); //房号
18. rec_vector.addElement(rs.getString(4)); //业主姓名
19. rec_vector.addElement(rs.getString(5)); //用途
20. double last = rs.getDouble(6); //上月读数
21. double current = rs.getDouble(7); //本月读数
22. rec_vector.addElement(String.valueOf(last));
23. rec_vector.addElement(String.valueOf(current));
24. rec_vector.addElement(String.valueOf(uPrice));
25. rec_vector.addElement(String.valueOf((current - last)
26. * uPrice)); //计算金额
27. vector.addElement(rec_vector);
28. }
29. tm.fireTableStructureChanged();
30. }

图9 电费报表输出

(7)历史记录查询
历史记录查询模块包含了按月份查询,按楼宇查询,按小区查询,按业主查询,其中按月份查询功能中通过选择日期可以查询全部小区各种费用读数;通过选择小区和时间可以查询到小区内全部楼宇的费用和小区内的全部业主的各种费用;通过选择小区、楼宇、时间可以查询小区内某栋楼的全部业主的各项费用,历史记录查询模块中按月查询功能如图10所示,其中涉及到的关键代码如下。
1.dateBox1.addItemListener(new ItemListener() {
2. public void itemStateChanged(ItemEvent event) {
3. int i = 0;
4. i = dateBox1.getSelectedIndex();
5. t++;
6. indate = new String(date1[i]);
7. }
8.});
9.uptownBox[0].addItemListener(new ItemListener() {
10. public void itemStateChanged(ItemEvent event) {
11. int i = 0;
12. i = uptownBox[0].getSelectedIndex();
13. t++;
14. inuptownname = new String(uptown_name2[i]);
15. inuptownid = new String(uptown_id2[i]);
16. if (t == 1) {
17. DateHistorySearch dhs1 = new DateHistorySearch(2,
18. inuptownid, inuptownname);
19. }
20. DateHistorySearch.this.setVisible(false);
21. }
22.});
23.button1.addActionListener(new ActionListener() {
24. public void actionPerformed(ActionEvent event) {
25. if (indate.equals(“选择日期”)) {
26. JOptionPane.showMessageDialog(null, “请选择日期后再按确定”, “Error”,
27. JOptionPane.PLAIN_MESSAGE);
28. } else {
29. UptownShow us = new UptownShow(indate);
30. DateHistorySearch.this.setVisible(false);
31. }
32. }
33.});

图10 按月历史查询

4.2数据库对象实现
(1)账号信息表login_info
login_info表中uname为主键,paswrd设为唯一约束,即不能出现相同的密码,创建过程如下。
1.CREATE TABLE login_info (
2. uname VARCHAR ( 12 ) PRIMARY KEY NOT NULL DEFAULT ‘’,
3. paswrd VARCHAR ( 20 ) UNIQUE NOT NULL DEFAULT ‘’,
4. purview SMALLINT ( 6 ) NOT NULL DEFAULT ‘0’
5.) ENGINE = INNODB DEFAULT CHARSET = utf8;
创建存储过程插入用户的登录信息到login_info表中。
1.CREATE DEFINER=root@localhost PROCEDURE login()
2.BEGIN
3.INSERT INTO login_info
4.VALUES
5. ( ‘admin’, ‘123456’, 2 ),
6. ( ‘pahran’, ‘2101227’, 0 );
7.END

(2)小区表district_info
小区表中设置小区编号district_id为主键,创建表并往表中插入数据的SQL和存储过程SQL如下。
1.CREATE TABLE district_info (
2. district_id smallint(6) PRIMARY KEY,
3. district_name varchar(12) NOT NULL DEFAULT ‘’,
4. address varchar(60) NOT NULL DEFAULT ‘’,
5. floor_space double NOT NULL DEFAULT ‘0’
6.) ENGINE=InnoDB DEFAULT CHARSET=utf8;
7.CREATE DEFINER=root@localhost PROCEDURE district()
8.BEGIN
9. INSERT INTO district_info
10.VALUES
11. ( 3, ‘龙锦苑一区’, ‘龙锦苑一区’, 782 ),
12. ( 4, ‘龙锦苑二区’, ‘龙锦苑二区’, 9523 ),
13. ( 5, ‘龙锦苑五区’, ‘龙锦苑五区’, 2364 ),
14. ( 1, ‘回龙观小区’, ‘回龙观路100号’, 56230 ),
15. ( 2, ‘霍营小区’, ‘霍营路200号’, 78420 ),
16. ( 6, ‘河南工业大学’,‘莲花街’,100000),
17. ( 7, ‘昆明理工大学’,‘昆明市’,1);
18.END

(3)楼宇信息表building_info
楼宇信息表中,设置约束,主键为distrct_id和building_id,totao_storey的取值范围在3-30之间,height取值范围在50-130之间,检查type值是否是商用和民用,status的值是否是use和notuse,其中district_id为该表的外键约束,依赖于district_info表中的district_id,创建表代码和存储过程插入数据SQL如下。
1.CREATE TABLE building_info (
2. district_id SMALLINT ( 6 ) NOT NULL DEFAULT ‘0’,
3. building_id SMALLINT ( 6 ) NOT NULL DEFAULT ‘0’ ,
4. total_storey SMALLINT ( 6 ) NOT NULL CHECK(total_storey>=3 AND total_storey<=30),
5. total_area DOUBLE NOT NULL DEFAULT ‘0’,
6. height DOUBLE NOT NULL CHECK (height>=50 AND height<= 130),
7. type VARCHAR(10) NOT NULL CHECK(type IN(‘商用’,‘民用’)),
8. STATUS VARCHAR ( 9 ) NOT NULL DEFAULT ‘’ CHECK (STATUS IN (‘use’,‘notuse’)),
9. FOREIGN KEY(district_id) REFERENCES district_info(district_id),-- 外键约束
10. PRIMARY KEY(district_id,building_id)
11.) ENGINE = INNODB DEFAULT CHARSET = utf8;
12.CREATE DEFINER=root@localhost PROCEDURE building()
13.BEGIN
14. INSERT INTO building_info
15.VALUES
16. ( 1, 1, 5, 20.3, 60, ‘民用’, ‘use’ ),
17. ( 1, 2, 5, 20.3, 60, ‘民用’, ‘use’ ),
18. ( 1, 3, 23, 40.3, 120, ‘民用’, ‘use’ ),
19.END

(4)业主/房屋信息表room_info
将room_info表中的district_id, building_id, room_id这三个属性设置为主键,确保一个小区内一个楼宇内不会出现一个房间号,用途purpose属性进行坚持是否是商用还是民用,状态status属性进行检查是否是use还是notuse,性别栏也要去在男女之内进行选择,district_info表中的district_id和building_info表中的building_id为room_info表中的外键,room_info表的建立以及插入数据的存储过程的SQL语句如下。
1.CREATE TABLE room_info (
2. district_id SMALLINT ( 6 ) NOT NULL,
3. building_id SMALLINT ( 6 ) NOT NULL,
4. room_id SMALLINT ( 6 ) NOT NULL DEFAULT ‘0’,
5. area DOUBLE NOT NULL DEFAULT ‘0’,
6. STATUS VARCHAR ( 9 ) NOT NULL DEFAULT ‘’ CHECK (
7. STATUS IN ( ‘use’, ‘notuse’ )),
8. purpose VARCHAR ( 10 ) NOT NULL DEFAULT ‘’ CHECK (
9. purpose IN ( ‘商用’, ‘民用’ )),
10. oname VARCHAR ( 20 ) NOT NULL DEFAULT ‘’,
11. sex VARCHAR ( 7 ) NOT NULL DEFAULT ‘’ CHECK (
12. sex IN ( ‘男’, ‘女’ )),
13. id_num VARCHAR ( 18 ) NOT NULL DEFAULT ‘’ UNIQUE,
14. address VARCHAR ( 60 ) NOT NULL DEFAULT ‘’,
15. phone DOUBLE NOT NULL DEFAULT ‘0’,
16. FOREIGN KEY ( district_id) REFERENCES district_info ( district_id ),-- 外键
17. FOREIGN KEY ( building_id) REFERENCES building_info ( building_id ),
18. PRIMARY KEY ( district_id, building_id, room_id ) – 主键
19.) ENGINE = INNODB DEFAULT CHARSET = utf8;
20.CREATE DEFINER=root@localhost PROCEDURE room()
21.BEGIN
22. INSERT INTO room_info
23.VALUES
24. ( 1, 1, 101, 12, ‘use’, ‘resident’, ‘李明’, ‘male’, ‘130921123’, ‘北京海淀区’, 13012345 );
25.END

(5)收费项目表unit_price_info
收费编号charge_id设置为主键,其创建表和添加数据的SQL如下所示。
1.CREATE TABLE unit_price_info (
2. charge_id smallint(6) PRIMARY KEY,
3. charge_name varchar(20) DEFAULT ‘’,
4. unit_price double DEFAULT ‘0’
5.) ENGINE=InnoDB DEFAULT CHARSET=utf8;
6.CREATE DEFINER=root@localhost PROCEDURE price()
7.BEGIN
8.INSERT INTO unit_price_info VALUES (1,‘电费’,6.2),
9. (2,‘煤气’,4.5),
10. (3,‘上水’,3.2),
11. (4,‘下水’,0.65);
12.END

(6)创建用户表记录表user_reading
用户表读数表中设置四个字段为主键,分别为district_id, building_id, room_id ,date,其中设置两个依赖,分别是小区号和楼宇号,创建user_reading表和存储过程的SQL如下。
1.CREATE TABLE user_reading (
2. district_id smallint(6) NOT NULL DEFAULT ‘0’,
3. building_id smallint(6) NOT NULL DEFAULT ‘0’,
4. room_id smallint(6) NOT NULL DEFAULT ‘0’,
5. date int(11) NOT NULL DEFAULT ‘0’,
6. water_reading double DEFAULT ‘0’ CHECK (water_reading > 0),
7. elec_reading double DEFAULT ‘0’ CHECK(elec_reading > 0),
8. gas_reading double DEFAULT ‘0’ CHECK(gas_reading > 0),
9. FOREIGN KEY ( district_id) REFERENCES district_info ( district_id ),-- 外键
10. FOREIGN KEY ( building_id) REFERENCES building_info ( building_id ),
11. PRIMARY KEY ( district_id, building_id, room_id ,date) – 主键
12.) ENGINE=InnoDB DEFAULT CHARSET=utf8;
13.INSERT INTO user_reading
14.VALUES
15. ( 1, 1, 101, 202101, 200501, 200501, 200501 )

(7)创建building_elec_reading表
1.CREATE TABLE building_elec_reading (
2. district_id smallint(6) DEFAULT ‘0’,
3. building_id smallint(6) DEFAULT ‘0’,
4. date int(11) DEFAULT ‘0’,
5. lift_ele_reading double DEFAULT ‘0’,
6. lighting_reading double DEFAULT ‘0’,
7. PRIMARY KEY(district_id,building_id,date),
8. FOREIGN KEY ( district_id) REFERENCES district_info ( district_id ),-- 外键
9. FOREIGN KEY ( building_id) REFERENCES building_info ( building_id )
10.) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(8)创建费用表paying_charge

  1. CREATE TABLE paying_charge (
  2. district_id smallint(6) NOT NULL DEFAULT ‘0’,
  3. building_id smallint(6) NOT NULL DEFAULT ‘0’,
  4. room_id smallint(6) NOT NULL DEFAULT ‘0’,
  5. date datetime NOT NULL,
  6. deadline datetime NOT NULL,
  7. totoal_fee double DEFAULT ‘0’,
  8. FOREIGN KEY ( district_id) REFERENCES district_info ( district_id ),-- 外键
  9. FOREIGN KEY ( building_id) REFERENCES building_info ( building_id ),
  10. PRIMARY KEY(district_id,building_id,room_id,date,deadline)
    11.) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(9)创建小区的技术表读数district_reading

  1. CREATE TABLE district_reading (
  2. district_id smallint(6) DEFAULT ‘0’,
  3. date int(11) DEFAULT ‘0’,
  4. tot_water_reading double DEFAULT ‘0’,
  5. tot_elec_reading double DEFAULT ‘0’,
  6. sec_supply_reading double DEFAULT ‘0’,
  7. FOREIGN KEY ( district_id) REFERENCES district_info ( district_id ),-- 外键
  8. PRIMARY KEY(district_id,date)
    9.) ENGINE=InnoDB DEFAULT CHARSET=utf8;

(10)创建插入数据到小区表的存储过程insert
通过输入参数创建存储过程,输入小区编号、名字、地址、面积四个参数进行表格数据的插入功能。
1.CREATE DEFINER=root@localhost PROCEDURE insert(in id VARCHAR(6),in name VARCHAR(12),in address VARCHAR(60),in floor_space DOUBLE)
2.BEGIN
3. INSERT INTO district_info VALUES (id ,name,address,floor_space);
4.END

(11)创建更新小区表数据的存储过程
通过传入五个参数,在WHRER语句中限定编号来更新确定编号的小区信息,对应的存储过程SQL语句如下所示。
1.CREATE DEFINER=root@localhost PROCEDURE update(in id VARCHAR(6),in name VARCHAR(12),in addr VARCHAR(60),in floor DOUBLE,in id1 VARCHAR(6) )
2.BEGIN
3. #Routine body goes here…
4. UPDATE district_info SET district_id = id , district_name = name ,address = addr , floor_space = floor
5. WHERE district_id = id1;
6.END

(12)创建删除小区信息的存储过程

  1. CREATE DEFINER=root@localhost PROCEDURE delete(in id SMALLINT(6))
    2.BEGIN
  2. #Routine body goes here…
  3. DELETE FROM district_info WHERE district_id = id;
    5.END

(13)创建查询小区信息的存储过程

  1. CREATE DEFINER=root@localhost PROCEDURE selsect()
    2.BEGIN
  2. #Routine body goes here…
  3. select * from district_info;
    5.END

(14)给district_info表插入数据创建触发器
1.CREATE DEFINER = root@localhost TRIGGER district1 AFTER INSERT ON Untitled FOR EACH ROW BEGIN
2.INSERT INTO district_info VALUES(id,name,address,space);
3.END;

(15)创建触发器,给room_info表中的sex属性进行检查,只能取“男”,“女”
1.DELIMITER KaTeX parse error: Expected group after '_' at position 24: …ATE TRIGGER sex_̲_check BEFORE I…

5总结
在建表设置约束时,开始建了一个小区表,小区编号自然为主键,后面建了一个楼宇表,该表中设置小区编号为外键,一开始也把楼宇编号设为主键,后来发现出现一个问题就是这样设置楼宇编号不能重复,但实际上只要在不同的小区编号里楼宇编号就可以重复,通过查阅资料进行修改,处理办法是将building_info表中的building_id和district_id同时设为主键,这样可以实现不同小区里面存在相同编号的楼宇,将district_info表中的district_id设为此表的外键。在room_info表中建外键的时候报错Failed to add the foreign key constraint. Missing index for constraint ‘FAS_CABINET_FK01’ in the referenced table ‘building_id’,想着将room_info表中的小区号依赖于district_info的小区号,楼宇号依赖于building_info中的楼宇号,出现报错经过检查发现是因为所设置的依赖不是主键或者是唯一的,不能作为另一个表的主键,通过更改上一个表的主键设置,最后成功实现该表的主键设置。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柒月玖.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值