JavaSwing+MySQL的物业管理系统

news2024/11/25 2:58:34

点击以下链接获取源码:
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中的楼宇号,出现报错经过检查发现是因为所设置的依赖不是主键或者是唯一的,不能作为另一个表的主键,通过更改上一个表的主键设置,最后成功实现该表的主键设置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么使用css写可视化常见的背景和元素

4个角的背景加背景颜色 .line-bg {--width: 2px;--height: 10px;--color: v-bind(colorConfig.visial.normal);background-color: rgba(255, 255, 255, 0.05);background-image: linear-gradient(to bottom, var(--color) var(--width), transparent 1px),linear-gradient(to r…

行云创新 CloudOS 助力上汽乘用车企业云原生IT架构变革

近日&#xff0c;在2023架构可持续未来峰会成都制造业分会场上&#xff0c;上海汽车集团股份有限公司乘用车公司基础架构部主管茹洋带来了议题为《云原生时代上汽乘用车企业IT架构变革和实践》的精彩演讲。他从云原生对于企业IT架构的意义、企业IT架构变革的必要性入手&#xf…

智能优化算法:塘鹅优化算法-附代码

智能优化算法&#xff1a;塘鹅优化算法 文章目录 智能优化算法&#xff1a;塘鹅优化算法1.塘鹅优化算法1.1种群初始化1.2探索阶段1.3开发阶段 2.实验结果3.参考文献4.Matlab5.python 摘要&#xff1a;塘 鹅 优 化 算 法&#xff08;Gannet Optimization Algorithm&#xff0c; …

Flutter、Android Studio 安装详细步骤以及常错解决

目录 一、前言 二、介绍 三、安装 (一&#xff09;、安装Flutter SDK 1&#xff09;双击文件夹&#xff0c;打开之后就是这样&#xff1a;​编辑 2&#xff09;双击此文件&#xff1a;​编辑 3&#xff09;此过程问题&#xff1a; (二&#xff09;、配置 Flutter SDK 环…

概率论和随机过程的学习和整理--番外16,N合1的合成问题的求平均个数,次数,阶数

目录 1 问题 2 用条件期望&#xff0c;求合成的次数 2.1 思路1 2.2 思路2 3 用条件期望&#xff0c;求合成的个数 3.1 令X表示用材料1往上合成时&#xff0c;合成材料2的个数 3.2 令Y表示用材料1往上合成时&#xff0c;合成材料3的个数 4 用条件期望&#xff0c;求合成…

【100天精通python】Day10:函数的创建和调用,参数传递,返回值,变量作用域以及匿名函数

目录 1. 函数的创建和调用 1.1 函数的创建 1.2 调用函数 2 参数传递 2.1 传递方式 2.2 形参和实参 2.3 位置参数 2.4 关键字参数 2.5 可变参数 2.6 为参数设置默认值 3 返回值 4 变量的作用域 4.1 局部变量 4.2 嵌套变量 4.3 全局变量 5 匿名函数&#xff0…

WAF/Web应用安全(拦截恶意非法请求)

Web 应用防火墙&#xff08;Web Application Firewall&#xff0c; WAF&#xff09;通过对 HTTP(S) 请求进行检测&#xff0c;识别并阻断 SQL 注入、跨站脚本攻击、跨站请求伪造等攻击&#xff0c;保护 Web 服务安全稳定。 Web 安全是所有互联网应用必须具备的功能&#xff0c…

OpenCV for Python 实战(一):获取图片拍摄GPS地址并自动添加水印

Hello 我们在OpenCV每天的基础博客当中已经更新了很多了&#xff0c;那么今天我们就来结合前几天的内容。做一个获取属性然后添加对应属性的水印。那让我们赶快开始吧~ 文章目录 图片EXIFPython 获取EXIFexifread库使用方法转换成文字地址 添加水印cv2.putText() 每日总结 图片…

数据可视化——绘制带有时间线的柱状图

文章目录 前言如何绘制柱状图添加时间线根据提供的数据绘制动态柱状图读取并删除无用数据将数据转换为字典创建柱状图并添加到时间线中配置选项并生成带有数据的折线图 前言 我们已经学习了使用 pyecharts 包中的模块和相应的方法绘制了折线图和地图&#xff0c;那么今天我将为…

Visual Studio Code安装详细教程

win电脑可以打开该网址 vs官方下载网站 点击这里免费下载 下载下来是一个安装程序&#xff0c;直接以管理员身份运行即可 我同意安装&#xff0c;然后选择D盘的一个空间进行安装 然后点击下一步 安装如图所示勾选&#xff0c;点击下一步 点击安装 等待安装完成即可 打开…

原神盲盒风格:AI绘画Stable Diffusion原神人物公仔实操:核心tag+lora模型汇总

本教程收集于&#xff1a;AIGC从入门到精通教程汇总 在这篇文章中&#xff0c;我们将深入探讨原神盲盒的艺术风格&#xff0c;以及如何运用AI绘画技术&#xff08;Stable Diffusion&#xff09;——来创造原神角色公仔。我们将通过实践操作让读者更好地理解这种技术&#xff0…

Vue中TodoLists案例_底部交互

与上一篇Vue中TodoList案例_底部统计有俩个文件变化了 App.vue&#xff1a;定义了一个方法checkAllTodo&#xff0c;实现全选和取消全选&#xff0c;并将方法传给儿子组件MyFooter <template><div id"root"><div class"todo-container">…

数学建模学习(4):TOPSIS 综合评价模型及编程实战

一、数据总览 需求&#xff1a;我们需要对各个银行进行评价&#xff0c;A-G为银行的各个指标&#xff0c;下面是银行的数据&#xff1a; 二、代码逐行实现 清空代码和变量的指令 clear;clc; 层次分析法 每一行代表一个对象的指标评分 p [8,7,6,8;7,8,8,7];%每一行代表一个…

JDK、JRE、JVM三者之间的关系

总结 JDK包含JRE&#xff0c;JRE包含JVM。 JDK (Java Development Kit)----Java开发工具包&#xff0c;用于Java程序的开发。 JRE (Java Runtime Environment)----Java运行时环境&#xff0c;只能运行.class文件&#xff0c;不能编译。 JVM (Java Virtual Machine)----Java虚拟…

解决 前端显示后端返回的null值为 1的问题

一 、问题描述 一个产品信息&#xff0c;有一个输入框的数据是后端返回回显出来的 但是后端返回这个字段时候&#xff0c;这个字段为空值&#xff0c;在后端就根本在data中没有返回这个字段任何信息 如返回的data {name : 123,age: 18} 因为age 为空&#xff0c;实际后端返回…

云原生|kubernetes|kubernetes集群部署神器kubekey安装部署高可用k8s集群(半离线形式)

前言&#xff1a; 云原生|kubernetes|kubernetes集群部署神器kubekey的初步使用&#xff08;centos7下的kubekey使用&#xff09;_晚风_END的博客-CSDN博客 前面利用kubekey部署了一个简单的非高可用&#xff0c;etcd单实例的kubernetes集群&#xff0c;经过研究&#xff0c;…

pt19盒模型布局

CSS 盒模型 内容尺寸overflow(占用内容框) 一般情况下&#xff0c;为元素设置width/height&#xff0c;指定的是内容框的大小 内容溢出&#xff1a;内容超出元素的尺寸范围&#xff0c;称为溢出。默认情况下溢出部分仍然可见&#xff0c;可以使用overflow调整溢出部分的显示…

【枚举】CF1833 D

Problem - D - Codeforces 题意&#xff1a; 给定一个序列&#xff0c;让你找一个区间&#xff0c;翻转区间内的数&#xff0c;交换前缀和后缀&#xff0c;让结果数组的字典序最大 思路&#xff1a; 观察样例可知&#xff0c;r是可以直接确定的&#xff0c;l是不确定的&…

使用Docker构建Nginx镜像并部署Web应用

文章目录 1. 简介2. 准备工作3. 编写Dockerfile4. 编写nginx.conf5. 构建镜像6. 查看镜像是否构建成功7. 运行容器8. 访问Web应用9. 总结 1. 简介 Docker是一个开源的容器化平台&#xff0c;它可以帮助我们快速构建、发布和运行应用程序&#xff0c;实现应用程序的环境隔离和依…

DevOps初识

博主入职了&#xff0c;正在学习一些在学校没有接触过的东西&#xff0c;在此进行记录~~~~ 背景 随着软件发布迭代的频率越来越高&#xff0c;传统的「瀑布型」&#xff08;开发—测试—发布&#xff09;模式已经不能满足快速交付的需求。打破开发和运维的壁垒&#xff0c;聪…