数据库-MySQL 实战项目——车库停车收费管理系统数据库设计与实现(附源码)

目录

一、前言

所需环境

需求:

背景:

 E-R图:

关系模式:

备注:

数据表的设计:

表1 车库

表2 操作员

表3 车辆

表4 停车卡

表5 停车记录

 二、创建数据库

1.创建各实体表:

(1)操作员:

(2)车库:

(3)停车卡:

(4)车辆:

(5)停车记录:

2.插入信息

(1) 操作员

(2)车库

(3)停车卡

(4)车辆

(5)停车记录

三、创建触发器

1.车辆进入车库自动发放停车卡

触发器插入车辆数据:

 效果展示:

2. 车辆出库自动更新车位数量

删除车辆数据:

效果展示:

 3.更新车辆进场时间自动更新停车记录进场时间

更新更新车辆进场时间

效果展示:

4.自动扣费更新余额 

插入停车记录

效果展示:

触发器备注:

四、答疑解惑


一、前言

所需环境

        1.运行环境:win11;

        2.MySQL可视化工具:navicat;

        3.数据库:MySql 5.7/8.0等版本均可;

需求:

400个车位(带编号)的停车场位于某地铁站旁边,不能超量停车,计费停车,第一个小时计费2元,后每小时1元,不足1小时的按1小时计。

停车场收费管理系统主要完成但不限于以下功能:

  1. 车位管理(车位有编号,剩余量多少有提示)
  2. 操作员信息管理
  3. 停车卡管理(停车卡是停车的依据,也是结算的依据,如某车辆(按车牌)什么时间取得某停车卡,结算时就按这个停车卡来结算)(停车卡可分类别,如:月租卡、特种免费卡、储值卡、时租卡(临时卡)等)
  4. 车辆入库管理(车牌,日期时间,停车卡等)
  5. 车辆出库管理(停车卡,车牌,日期时间,计费,操作员等)

背景:

  1. 一个停车位只能被一辆车占用
  2. 一个操作员可以有多个停车记录,但一个停车记录只能对应一个操作员
  3. 一辆车可以拥有多个停车记录(每次进入停车场都要记录)
  4. 一个停车卡可以对应多个停车记录(即同一个停车卡可以多次进入停车场停放车辆),但一个停车记录只能对应一个停车卡
  5. 一个停车记录对应一个停车位,一个停车位可以对应多个停车记录(即同一个停车位可以停放多辆车)
  6. 一个停车记录可以对应一个停车费用(记录出库时计算),一个停车费用对应一个停车记录

其中:

  1. 车库包含下列属性:车位号,总车位数,剩余车位数
  2. 操作员包含下列属性:工号,姓名,性别,年龄
  3. 停车卡包含下列属性:卡号,类型(月租卡、储值卡、临时卡等),停车时间,余额
  4. 车辆包含下列属性:  车牌号,进场时间
  5. 停车记录包含下列属性:订单编号,入库时间,出库时间,停车时间,费用

 E-R图:

数据库-MySQL 实战项目——车库停车收费管理系统数据库设计与实现(附源码)_第1张图片

关系模式:

车库(车位号,总车位数,剩余车位数,工号

操作员(工号,姓名,性别,年龄)

停车卡停车卡号,类型,余额,工号

车辆(车牌号,进场时间, 停车卡号

停车记录(订单编号入库时间,出库时间,停车时间,费用,车牌号

备注:

下划线为主键,红色字为外键;

数据表的设计:

表1 车库

字段

数据类型

长度

备注

车位号

varchar

50

主键

总车位数

int

5

剩余车位数

int

5

Not null

工号

varchar

50

外键

表2 操作员

字段

数据类型

长度

备注

工号

varchar

50

主键

姓名

varchar

50

Not null

性别

varchar

50

年龄

int

5

表3 车辆

字段

数据类型

长度

备注

车牌号

varchar

50

主键

进场时间

date

Not null

停车卡号

varchar

50

外键

表4 停车卡

字段

数据类型

长度

备注

停车卡号

varchar

50

主键

类型

varchar

10

Not null

余额

float

10

工号

varchar

50

外键

表5 停车记录

字段

数据类型

长度

备注

订单编号

varchar

50

主键

入库时间

date

Not null

出库时间

date

Not null

停车时间

int

8

费用

varchar

20

车牌号

varchar

20

外键

 二、创建数据库

Create database 车库停车收费管理系统 character set utf8 collate utf8_general_ci

use 车库停车收费管理系统    //在新建查询选择前选择数据库

1.创建各实体表:

(1)操作员:
CREATE TABLE 操作员 (
  工号 VARCHAR(50) NOT NULL PRIMARY KEY,
  姓名 VARCHAR(50) NOT NULL,
  性别 VARCHAR(50) NOT NULL,
  年龄 INT NOT NULL
);
(2)车库:
CREATE TABLE 车库 (
  车位号 VARCHAR(50) NOT NULL PRIMARY KEY,
  总车位数 INT NOT NULL,
  剩余车位数 INT NOT NULL,
  工号 VARCHAR(50),
  FOREIGN KEY (工号) REFERENCES 操作员(工号)
);
(3)停车卡:
CREATE TABLE 停车卡 (
   停车卡号 VARCHAR(50),
   类型 VARCHAR(10),
   余额 FLOAT(8),
   工号 VARCHAR(50),
   PRIMARY KEY (停车卡号),
   FOREIGN KEY (工号) REFERENCES 操作员(工号) 
);
(4)车辆:
CREATE TABLE 车辆 (
  车牌号 VARCHAR(20) NOT NULL PRIMARY KEY,
  进场时间 DATETIME NOT NULL,
  停车卡号 VARCHAR(50) NOT NULL,
  FOREIGN KEY (停车卡号) REFERENCES 停车卡(停车卡号)
);
(5)停车记录:
CREATE TABLE 停车记录 (
   订单编号 VARCHAR(50),
   入库时间 DATETIME,
   出库时间 DATETIME,
   停车时间 INT(8),
   费用 VARCHAR(20),
   车牌号 VARCHAR(20),
   PRIMARY KEY (订单编号),
   FOREIGN KEY (车牌号) REFERENCES 车辆(车牌号)
);

2.插入信息

(1) 操作员
INSERT INTO 操作员 VALUES ('Y001', '张三', '男', '28');
(2)车库
INSERT INTO 车库 VALUES (1, 400, 43, 'Y001');
INSERT INTO 车库 VALUES (2, 400, 45, 'Y001');
INSERT INTO 车库 VALUES (3, 400, 42, 'Y001');
INSERT INTO 车库 VALUES (4, 400, 46, 'Y001');
INSERT INTO 车库 VALUES (5, 400, 44, 'Y001');
INSERT INTO 车库 VALUES (6, 400, 41, 'Y001');
INSERT INTO 车库 VALUES (7, 400, 49, 'Y001');
INSERT INTO 车库 VALUES (8, 400, 39, 'Y001');
INSERT INTO 车库 VALUES (9, 400, 48, 'Y001');
INSERT INTO 车库 VALUES (10, 400, 47, 'Y001');
(3)停车卡
INSERT INTO 停车卡 VALUES ('T1001', '月租卡', 500, 'Y001');
INSERT INTO 停车卡 VALUES ('T1002', '特种免费卡', 200, 'Y001');
INSERT INTO 停车卡 VALUES ('T1003', '储值卡', 300, 'Y001');
INSERT INTO 停车卡 VALUES ('T1004', '临时卡', 120, 'Y001');
INSERT INTO 停车卡 VALUES ('T1005', '临时卡', 80, 'Y001');
INSERT INTO 停车卡 VALUES ('T1006', '特种免费卡', 400, 'Y001');
INSERT INTO 停车卡 VALUES ('T1007', '月租卡', 200, 'Y001');
INSERT INTO 停车卡 VALUES ('T1008', '临时卡', 60, 'Y001');
INSERT INTO 停车卡 VALUES ('T1009', '储值卡', 700, 'Y001');
INSERT INTO 停车卡 VALUES ('T1010', '临时卡', 100, 'Y001');
(4)车辆
INSERT INTO 车辆 VALUES ('粤A123456', '2023-05-26 08:00:00', 'T1001');
INSERT INTO 车辆 VALUES ('川A23456', '2023-05-25 09:00:00', 'T1002');
INSERT INTO 车辆 VALUES ('川G34567', '2023-05-26 10:00:00', 'T1003');
INSERT INTO 车辆 VALUES ('川J45678', '2023-05-24 11:00:00', 'T1004');
INSERT INTO 车辆 VALUES ('川A56789', '2023-05-24 08:00:00', 'T1005');
INSERT INTO 车辆 VALUES ('川S67890', '2023-05-26 13:00:00', 'T1006');
INSERT INTO 车辆 VALUES ('川A78901', '2023-05-26 14:00:00', 'T1007');
INSERT INTO 车辆 VALUES ('川S89012', '2023-05-27 15:00:00', 'T1008');
INSERT INTO 车辆 VALUES ('川A90123', '2023-05-27 16:00:00', 'T1009');
INSERT INTO 车辆 VALUES ('鲁A01234', '2023-05-25 17:00:00', 'T1010');
(5)停车记录
INSERT INTO 停车记录 VALUES ('202305260801', '2023-05-26 08:00:00', '2023-05-26 10:00:00', 2, '3', '粤A123456');
INSERT INTO 停车记录 VALUES ('202305270902', '2023-05-25 09:00:00', '2023-05-26 11:00:00', 26, '27', '川A23456');
INSERT INTO 停车记录 VALUES ('202305261003', '2023-05-26 10:00:00', '2023-05-26 12:00:00', 2, '3', '川G34567');
INSERT INTO 停车记录 VALUES ('202305241104', '2023-05-24 11:00:00', '2023-05-24 15:00:00', 4, '5', '川J45678');
INSERT INTO 停车记录 VALUES ('202305240805', '2023-05-24 08:00:00', '2023-05-24 09:00:00', 1, '2', '川A56789');
INSERT INTO 停车记录 VALUES ('202305260806', ' 2023-05-26 13:00:00', ' 2023-05-26 20:00:00', 7, '8', '川S67890');
INSERT INTO 停车记录 VALUES ('202305260807', ' 2023-05-26 14:00:00', ' 2023-05-26 20:00:00', 6, '7', '川A78901');
INSERT INTO 停车记录 VALUES ('202305270808', '2023-05-27 15:00:00', '2023-05-27 20:00:00', 5, '6', '川S89012');
INSERT INTO 停车记录 VALUES ('202305270809', '2023-05-27 16:00:00', '2023-05-27 20:00:00', 4, '5', '川A90123');
INSERT INTO 停车记录 VALUES ('202305250810', '2023-05-25 17:00:00', '2023-05-25 21:00:00', 4, '5', '鲁A01234'); 

三、创建触发器

1.车辆进入车库自动发放停车卡

CREATE TRIGGER 自动发放停车卡
  AFTER INSERT ON 车辆
  FOR EACH ROW
BEGIN
	INSERT INTO 停车卡 (停车卡号, 类型, 余额, 工号) VALUES (NEW.车牌号, '临时卡', 0, 'Y001');
END;
触发器插入车辆数据:
INSERT INTO 车辆 VALUES ('川G01234', '2023-05-30 17:00:00', 'T1011');
 效果展示:

数据库-MySQL 实战项目——车库停车收费管理系统数据库设计与实现(附源码)_第2张图片

2. 车辆出库自动更新车位数量

CREATE TRIGGER 车位更新
AFTER DELETE ON 车辆
FOR EACH ROW
UPDATE 车库 SET 剩余车位数 = 剩余车位数 + 1 WHERE 车位号 = '1';
删除车辆数据:
-- 因为外键约束所以要先删除停车记录
DELETE FROM 停车记录 WHERE 车牌号 = '粤A123456';
DELETE FROM 车辆 WHERE 车牌号 = '粤A123456';
效果展示:

数据库-MySQL 实战项目——车库停车收费管理系统数据库设计与实现(附源码)_第3张图片

 3.更新车辆进场时间自动更新停车记录进场时间

AFTER UPDATE ON 车辆
FOR EACH ROW
BEGIN
  UPDATE 停车记录 SET 入库时间 = NEW.进场时间
  WHERE 车牌号 = NEW.车牌号;
END;
更新更新车辆进场时间
UPDATE 车辆 SET 进场时间 = '2023-05-26 08:35:10' WHERE 车牌号 = '粤A123456';
效果展示:

数据库-MySQL 实战项目——车库停车收费管理系统数据库设计与实现(附源码)_第4张图片

4.自动扣费更新余额 

CREATE TRIGGER 更新余额
AFTER INSERT ON 停车记录
FOR EACH ROW
BEGIN
  UPDATE 停车卡 SET 余额 = 余额 - NEW.费用 WHERE 停车卡号 = (SELECT 停车卡号 FROM 车辆 WHERE 车牌号 = NEW.车牌号);
END;
插入停车记录
INSERT INTO 停车记录 VALUES ('202305250811', '2023-05-26 17:00:00', '2023-05-26 21:00:00', 4, '5', '鲁A01234');
效果展示:

数据库-MySQL 实战项目——车库停车收费管理系统数据库设计与实现(附源码)_第5张图片

触发器备注:

        查询触发器:Show triggers

        删除触发器:DROP TRIGGER 触发器名;

        例如:DROP TRIGGER 更新余额;

四、答疑解惑

代码有问题或有什么其他运行环境问题都可以随时私信博主或联系博主QQ:1196094293

博主都会逐一解答,谢谢各位的支持~~

你可能感兴趣的:(MySQL数据库,mysql,数据库,sql)