#创建ATM数据库
CREATE DATABASE ATM;

#创建用户
CREATE USER `ATMMaster` IDENTIFIED BY '1234';
GRANT ALL ON ATM.* TO 'bankMaster';
CREATE DATABASE `ATM`;

USE ATM;

##删除数据库
DROP DATABASE ATM;

#用例3:创建客户信息表添加外键
CREATE TABLE `userInfo`(
`customerID` INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '客户编号',
`customerName` CHAR(8) NOT NULL COMMENT '开户名',
`telephone` CHAR(12) NOT NULL COMMENT '手机号码',
`address` VARCHAR(50) NOT NULL COMMENT '居住地址',
`PID` CHAR(18) UNIQUE NOT NULL COMMENT '身份证号'
)ENGINE = INNODB,COMMENT='用户表';

#创建存款类型表
CREATE TABLE `Deposit`(
`savingID` INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '存款编号',
`savingName` VARCHAR(20) NOT NULL COMMENT '存款名称',
`descrip` VARCHAR(50)
)ENGINE = INNODB,COMMENT='存款类型表';

#创建银行卡信息表
CREATE TABLE `cardInfo`(
`cardID` CHAR(20) NOT NULL PRIMARY KEY COMMENT '卡号',
`customerID` INT(4) NOT NULL COMMENT '客户编号',
`savingID` INT(4) NOT NULL COMMENT '存款类型',
`curID` VARCHAR(10) NOT NULL DEFAULT "RMB" COMMENT '币种',
`openDate` TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '开户日期',
`openMoney` DECIMAL(20,2) NOT NULL COMMENT '开户金额',
`balance` DECIMAL(20,2) NOT NULL COMMENT '余额',
`password` CHAR(10) NOT NULL COMMENT '密码',
`IsReportLoss` INT(2) NOT NULL DEFAULT '0' COMMENT '是否挂失 '
)ENGINE = INNODB,COMMENT='银行卡信息表';

#创建交易信息表
CREATE TABLE `tradeInfo`(
`tradeNum` INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT '交易流水号',
`tradeDate` TIMESTAMP NOT NULL DEFAULT NOW() COMMENT '交易日期',
`tradeType` CHAR(4) NOT NULL COMMENT '交易类型',
`cardID` CHAR(20) NOT NULL COMMENT '银行卡号',
`tradeMoney` DECIMAL(20,2) NOT NULL COMMENT '交易金额',
`remark` VARCHAR(100) NOT NULL COMMENT '备注'
)ENGINE = INNODB,COMMENT='交易信息表';

##创建外键约束
#添加外键约束 主表在后面 从表在前面
#客户信息主表 与 银行卡信息从表 的外键关系
ALTER TABLE `cardInfo` ADD CONSTRAINT FOREIGN KEY (`customerID`)REFERENCES `userInfo`(`customerID`);
#存款类型主表 与 银行卡信息从表 的外键关系
ALTER TABLE `cardInfo` ADD CONSTRAINT FOREIGN KEY (`savingID`)REFERENCES `Deposit`(`savingID`);
#银行卡信息主表 与 交易信息表从表 的外键关系
ALTER TABLE `tradeInfo` ADD CONSTRAINT FOREIGN KEY (`cardID`)REFERENCES `cardInfo`(`cardID`);

#用例4:插入测试数据
#存款类型
INSERT INTO `deposit` (`savingName`,`descrip`) VALUES ('活期','按存款日结算利息');
INSERT INTO `deposit` (`savingName`,`descrip`) VALUES ('定期一年','存款期是1年');
INSERT INTO `deposit` (`savingName`,`descrip`) VALUES ('定期二年','存款期是2年');
INSERT INTO `deposit` (`savingName`,`descrip`) VALUES ('定期三年','存款期是3年');
INSERT INTO `deposit` (`savingName`) VALUES ('定活两便');
INSERT INTO `deposit` (`savingName`) VALUES ('通知');
INSERT INTO `deposit` (`savingName`,`descrip`) VALUES ('零存整取一年','存款期是1年');
INSERT INTO `deposit` (`savingName`,`descrip`) VALUES ('零存整取二年','存款期是2年');
INSERT INTO `deposit` (`savingName`,`descrip`) VALUES ('零存整取三年','存款期是3年');
INSERT INTO `deposit` (`savingName`,`descrip`) VALUES ('存本取息五年','按月支取利息');
SELECT * FROM `deposit`;
#客户信息
INSERT INTO `userinfo`(`customerName`,`PID`,`telephone`,`address`)VALUES('张三','123456789012345999','010-67898978','北京海淀');
INSERT INTO `userinfo`(`customerName`,`PID`,`telephone`,`address`)VALUES('李四','321245678912345678','765-44443333','云南贵州');
INSERT INTO `userinfo`(`customerName`,`PID`,`telephone`,`address`)VALUES('王五','567891234532124670','010-44443333','湖南长沙');
INSERT INTO `userinfo`(`customerName`,`PID`,`telephone`,`address`)VALUES('丁六','567891321242345618','052-43345543','广东东莞');
SELECT * FROM `userinfo`;
#银行卡信息
INSERT INTO `cardinfo`(`cardID`,`savingID`,`openMoney`,`balance`,`customerID`,`password`)VALUES('1010357612345678',1,1000,1000,1,'123321');
INSERT INTO `cardinfo`(`cardID`,`savingID`,`openMoney`,`balance`,`customerID`,`password`)VALUES('1010357612121134',2,2000,2000,2,'123456');
INSERT INTO `cardinfo`(`cardID`,`savingID`,`openMoney`,`balance`,`customerID`,`password`)VALUES('1010357612121130',2,3000,3000,3,'789789');
INSERT INTO `cardinfo`(`cardID`,`savingID`,`openMoney`,`balance`,`customerID`,`password`)VALUES('1010357612121004',2,4000,4000,4,'456456');
SELECT * FROM cardInfo;
#交易信息表插入交易记录
INSERT INTO `tradeinfo`(`tradeType`,`cardID`,`tradeMoney`) VALUES('支取','1010357612399998',600);
INSERT INTO `tradeinfo`(`tradeType`,`cardID`,`tradeMoney`) VALUES('存入','1010357612121134',4000);
INSERT INTO `tradeinfo`(`tradeType`,`cardID`,`tradeMoney`) VALUES('支取','1010357612345678',900);
INSERT INTO `tradeinfo`(`tradeType`,`cardID`,`tradeMoney`) VALUES('存入','1010357999911134',5000);
SELECT * FROM tradeInfo;
#更新银行卡信息表中的现有余额
UPDATE `cardinfo` SET `balance`=`balance`-900 WHERE `cardID`='1010357612345678';
UPDATE `cardinfo` SET `balance`=`balance`+5000 WHERE `cardID`='1010357612121134';
SELECT * FROM cardInfo;

##用例5:模拟常规业务
#1.修改客户密码
#张三(卡号为1010 3576 1234 5678)修改银行卡密码为123321
#李四(卡号为1010 3576 1212 1134)修改银行卡密码为123456
UPDATE `cardinfo` SET `password`='123321' WHERE `cardID`='1010357612345678';
UPDATE `cardinfo` SET `password`='123456' WHERE `cardID`='1010357612121134';
SELECT *FROM cardinfo

#2.办理银行卡挂失
#李四(卡号为1010 3576 1212 1134)因银行卡丢失,申请挂失
UPDATE `cardinfo` SET `IsReportLoss`=1 WHERE `cardID`='1010357612121134' ;
SELECT `cardID`AS '卡号',`curID`AS '货币',`savingName`AS '储蓄种类',`openDate`AS '开户日期',`openMoney`AS '开户金额',`balance`AS '余额',`password`AS '密码',
`IsReportLoss`AS '是否挂失', `customerName`AS '客户姓名'
FROM `cardinfo`, `deposit`, `userinfo`
WHERE `cardinfo`.`savingID`=`deposit`.`savingID` AND `cardinfo`.`customerID` = `userinfo`.`customerID`

#3 统计银行总存入金额和总支取金额
SELECT `tradeType` AS '交易类型',SUM(`tradeMoney`) AS '总金额'
FROM `tradeinfo`
GROUP BY `tradeType`;

#4查询本周开户信息
SELECT C.`cardID`AS '卡号',U.`customerName` AS '姓名',C.`curID`AS '货币',D.`savingName`AS '存款类型',C.`openDate`AS '开户日期',C.`openMoney`AS '开户金额',C.`balance`AS '余额',C.`IsReportLoss`AS '账户状态'
FROM `cardinfo` C
INNER JOIN `userinfo` U ON (C.`customerID` = U.`customerID`)
INNER JOIN `deposit` D ON (C.`savingID` = D.`savingID` )
WHERE WEEK(NOW()) = WEEK(`openDate`);

#5查询本月交易金额最高的卡号
SELECT DISTINCT `cardID`
FROM `tradeinfo`
WHERE `tradeMoney`=(
SELECT MAX(`tradeMoney`)
FROM `tradeinfo`
WHERE MONTH(`tradeDate`)=MONTH(NOW())AND YEAR(`tradeDate`)=YEAR(NOW())
);

#6查询挂失客户信息
SELECT `customerName` AS '客户姓名',`telephone` AS '联系电话'
FROM `userinfo`
WHERE `customerID` IN(SELECT `customerID` FROM `cardinfo` WHERE `IsReportLoss`=1)

#7催款提醒业务
SELECT `customerName` AS '客户姓名',`telephone` AS '联系电话',`balance` AS '存款金额'
FROM `userinfo`
INNER JOIN `cardinfo` ON `cardinfo`.`customerID`=`userinfo`.`customerID`
WHERE `balance`<200;

##用例6:创建、使用客户有好信息视图
#view_userInfo:输出银行客户记录
DROP VIEW IF EXISTS view_userInfo;
#输出银行客户记录
CREATE VIEW view_userInfo
AS
SELECT `customerID` AS 客户编号,`customerName` AS 开户名, `PID` AS 身份证号,`telephone` AS 电话号码,`address` AS 居住地址
FROM userInfo;
#查看
SELECT * FROM view_userInfo;

#view_cardInfo:输出银行卡记录
DROP VIEW IF EXISTS view_cardInfo;
#银行卡信息表视图
CREATE VIEW view_cardInfo
AS
SELECT c.cardID AS '卡号',u.customerName AS '客户',c.curID AS '货币种类', d.savingName AS '存款类型',c.openDate AS '开户日期',c.balance AS '余额',c.password AS '密码',IsReportLoss AS '是否挂失'
FROM `cardinfo` c, `deposit` d,`userinfo` u
WHERE c.`savingID`=d.`savingID` AND c.`customerID`=u.`customerID`;
#查看
SELECT * FROM view_cardInfo;

#view_transInfo:输出银行卡的交易记录
DROP VIEW IF EXISTS view_transInfo;

CREATE VIEW view_transInfo
AS
SELECT `tradeDate` AS '交易日期',`tradeType` AS '交易类型', `cardID` AS '卡号',`tradeMoney` AS '交易金额',`remark` AS '备注'
FROM `tradeinfo`;
#查看
SELECT * FROM view_transInfo;

#用例7:使用事务完成转账
#从卡号为“1010357612121134”的账户中转出300元给卡号为“1010357612345678”的账户-
BEGIN;
INSERT INTO tradeInfo(tradeType,cardID,tradeMoney)
VALUES('支取','1010357612121134',300);
UPDATE cardInfo SET balance=balance-300 WHERE cardID='1010357612121134';
INSERT INTO tradeInfo(tradeType,cardID,tradeMoney)
VALUES('存入','1010357612345678',300);
UPDATE cardInfo SET balance=balance+300 WHERE cardID='1010357612345678';
COMMIT; #提交事务
ROLLBACK; #回滚事务

SELECT * FROM cardInfo;
SELECT * FROM tradeInfo;

Mysql Atm取款机系统模拟案例的更多相关文章

  1. 大话JS面向对象之开篇万物皆对象------(ATM取款机引发的深思)

    一,总体概要 OO(面向对象)概念的提出是软件开发工程发展的一次革命,多年来我们借助它使得很多大型应用程序得以顺利实现.如果您还没有掌握并使用OO进行程序设计和开发,那么您无疑还停留在软件开发的石器时 ...

  2. Oracle实战训练——ATM取款机业务

    ATM取款机的数据库模拟开发和实战总结 一.ATM实战开发的简介. 学习了几天的Oracle,开始着手用数据库PL/SQL语言做一个简单的ATM取款机业务,主要是为了巩固数据库的知识,并非真正的去实现 ...

  3. 第一周:设计一个简易ATM取款机简易程序(2)

    1.了解用户对ATM取款机功能需求如下: 2.新建一个login函数使用for循环方法和if选择方法编写登陆界面用来及设置ATM内用户的金额和取款机内的金额: 3.使用新建函数方法及if选择方法编写登 ...

  4. MySQL 数据库增量数据恢复案例

    MySQL 数据库增量数据恢复案例 一.场景概述 MySQL数据库每日零点自动全备 某天上午10点,小明莫名其妙地drop了一个数据库 我们需要通过全备的数据文件,以及增量的binlog文件进行数据恢 ...

  5. Mysql存储过程知识,案例--mysql存储过程基本函数

    Mysql存储过程知识,案例: create procedure delete_setting(in p_settingid integer) begin delete from setting wh ...

  6. 170301、使用Spring AOP实现MySQL数据库读写分离案例分析

    使用Spring AOP实现MySQL数据库读写分离案例分析 原创 2016-12-29 徐刘根 Java后端技术 一.前言 分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案 ...

  7. ATM取款机的数据库模拟开发和实战总结

    一.ATM实战开发的简介. 学习了几天的Oracle,开始着手用数据库PL/SQL语言做一个简单的ATM取款机业务,主要是为了巩固数据库的知识,并非真正的去实现高端的业务.有兴趣的可以看看,希望对同胞 ...

  8. ATM取款机模拟——数据结构课设

    今天帮人写的第二篇课设 . ;-) 机智的窝 要求:大概说一下吧,就是要创建一个用户(初始化一账户),模拟ATM的业务(取款,100的整数倍,改密               码,查剩余金额.等等,各 ...

  9. LinuxC语言实现ATM取款机实验Socket

    链接:https://pan.baidu.com/s/1sZt4qhYc6CDJVpoJHbtw-Q 提取码:53ot 复制这段内容后打开百度网盘手机App,操作更方便哦 本实验用的是Centos7t ...

随机推荐

  1. hgoi#20190513

    T1-Felicity is Coming! 神奇宝贝的进化方案是一个全排列,假设有三种宝可梦,那么对应就可以有: (1,2,3)(1,3,2)(2,1,3)(2,3,1)(3,1,2)(3,2,1) ...

  2. Python一基本数据类型(dict)

    一. 字典的简单介绍    字典(dict)是python中唯一的一个映射类型.他是以{ }括起来的键值对组成. 在dict中key是 唯一的. 在保存的时候, 根据key来计算出一个内存地址. 然后 ...

  3. Tomcat常见问题[内存溢出,虚拟目录配置等](一)

    一.Tomcat内存溢出的解决方法 内存溢出一般有如下三种常见的原因: OutOfMemoryError: Java heap space OutOfMemoryError: PermGen spac ...

  4. vsphere网络

    物理网络 物理机间建立的网络,VMware ESXi运行于物理机之上 虚拟网络 单台物理机上运行的虚拟机之间通信形成的逻辑网络. 一.网络概述 1. 物理以太网交换机 2.vSphere标准交换机 虚 ...

  5. java基础知识总结(二)

    Java中的代码块 java中的代码块是用{}括起来的代码,进行一些功能的限定 静态代码块:在类第一次被初始化的是后执行,负责一些类的初始化操作,仅仅只执行一次 构造代码块:顾名思义,辅助构造器进行初 ...

  6. raft算法解析

    一.raft算法引入 在寻找一种易于理解的一致性算法的研究(In Search of an Understandable Consensus Algorithm-extended version) 论 ...

  7. 【朝花夕拾】Android自定义View篇之(八)多点触控(上)MotionEvent简介

    前言 在前面的文章中,介绍了不少触摸相关的知识,但都是基于单点触控的,即一次只用一根手指.但是在实际使用App中,常常是多根手指同时操作,这就需要用到多点触控相关的知识了.多点触控是在Android2 ...

  8. Django迁移数据库报错

    Django迁移数据库报错 table "xxx" already exists错误 django在migrate时报错django migrate error: table 'x ...

  9. SpringBoot(十九)_404返回统一异常处理结果

    之前写过一篇统一异常处理的文章,今天测试了下如果访问一个不存在的接口,也想返回统一的错误信息,应该怎么做 1.修改application.properties文件 # 自定义404 #出现错误时, 直 ...

  10. hiccup和Latch off

    hiccup(Constant-Current)和Latch off 限电流保护的两种形式 hiccup:一种是以恒定电流存在,这种一般是可恢复的,当故障解除后自动恢复: Latch off:一种是锁 ...