mysql的ATM存取款機系統


##建庫
CREATE DATABASE bankDB;
##客戶信息表
CREATE TABLE userInfo
(
customerID INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
customerName CHAR NOT NULL,
PID CHAR(18) NOT NULL,
telephone CHAR(11) NOT NULL,
address VARCHAR(128)
)


##創建銀行信息表
CREATE TABLE cardInfo
(
cardID CHAR PRIMARY KEY NOT NULL,            
curID VARCHAR(19) NOT NULL,
savingID INT NOT NULL,
openDate TIMESTAMP NOT NULL,
openMoney DECIMAL NOT NULL,
balance DECIMAL NOT NULL, 
`password` VARCHAR(6) NOT NULL,
IsReportLoss BIT NOT NULL,
customerID INT NOT NULL
)
##交易信息表結構 (tradeInfo)

CREATE TABLE tradeInfo
(
transDate TIMESTAMP,
cardID    CHAR NOT NULL,
transType CHAR NOT NULL,
transMoney DECIMAL NOT NULL,
remark    TEXT
)
##存款類型表結構(deposit)

CREATE TABLE deposit
(
savingID INT PRIMARY KEY AUTO_INCREMENT NOT NULL,
savingName VARCHAR(32) NOT NULL,
descrip    VARCHAR(32)
)

##建立userInfo的約束
##身份證,唯一約束
ALTER TABLE userInfo 
ADD CONSTRAINT id_PID CHECK (len(PID)=18 OR len(PID)=15),
ADD CONSTRAINT UQ_PID UNIQUE(PID);


##`cardinfo`的約束
##,必填,默認為RMB,
##savingID,外鍵.openDate,默認為系統當前日期 這個不用建 因為 TIMESTAMP已經是當前日期

##openMoney,不低於1元
##balance,不低於1元
##password,6位數字,開戶時默認為6個“8”
##IsReportLoss,是/否值,默認為“否”
##customerID,外鍵
ALTER TABLE cardinfo ALTER COLUMN curID SET DEFAULT'RMB'; 

ALTER TABLE cardinfo
ADD CONSTRAINT ck_openMoney CHECK(openMoney>=1)

ALTER TABLE cardinfo
ADD CONSTRAINT ck_balance CHECK(balance>=1)

ALTER TABLE cardinfo ALTER COLUMN `password` SET DEFAULT'888888';
##否為0,是為1
ALTER TABLE cardinfo ALTER COLUMN IsReportLoss SET DEFAULT '0';

ALTER TABLE cardinfo
ADD CONSTRAINT fk_deposit_cardinfo_savingID FOREIGN KEY(savingID) REFERENCES `deposit`(`savingID`)

ALTER TABLE cardinfo
ADD CONSTRAINT FK_customerID FOREIGN KEY(customerID) REFERENCES userInfo(customerID)


##交易信息表結構 (tradeInfo)的約束
##默認為系統當前日期 不用建 因為類型已經是系統當前的日期了
##cardID外鍵,必填
ALTER TABLE tradeInfo ADD CONSTRAINT fk_cardinfo_tradeInfo_cardID FOREIGN KEY (cardID) REFERENCES cardinfo(cardID);

##添加數據
INSERT INTO userinfo(customerName,PID,telephone,address)
VALUES('張四龍','123456789012345','01067898978','北京海淀'),
('張藝龍','321245678912345678','0478-44443333','山東一條街'),
('張三龍','123456789032145','2222-63598978','河南'),
('張二龍','56789123453212461','010-44442222','河北')



INSERT INTO `deposit`(`savingName`,`descrip`)
VALUES('活期','錢生錢!!'),
('死期','錢死錢!!'),
('活期','錢生錢!!'),
('死期','錢生死錢!!')


INSERT INTO `cardinfo`(`cardID`,`savingID`,`openMoney`,`balance`,`customerID`)
VALUES('7418529631012345',1,5,200,2),
('8529631234785623',2,4,100,1),
('7415987563214756',3,3,50,3),
('2599774315533222',4,2,30,4)



INSERT INTO`tradeinfo`(`transDate`,`cardID`,`transType`,`transMoney`,`remark`)
VALUES('2008-6-15 11:14:52','7418529631012345','支取',1000,''),
('2017-6-15 11:14:52','8529631234785623','支取',1000,'很好'),
('2012-6-15 11:14:52','7415987563214756','存入',450,'非常好'),
('2010-6-15 11:14:52','2599774315533222','存入',780,'vary好')

#模擬常規業務
#1.修改
UPDATE `cardinfo` SET `password` = '123456' WHERE `cardID` = '2599774315533222';
UPDATE `cardinfo` SET `password` = '123123' WHERE `cardID` = '7415987563214756';
##2.辦理銀行卡掛失
UPDATE `cardinfo` SET `IsReportLoss` = 1 WHERE `cardID` = '7415987563214756';
##3.統計銀行總存入的金額和總支取金額
SELECT `tradeinfo`.`transType`AS 資金流向, SUM(`transMoney`) FROM tradeInfo
GROUP BY `tradeinfo`.`transType`

##4.查看本周開戶信息
SELECT `cardID`AS 卡號,userInfo.`customerName`AS 姓名,curID AS 貨幣,`savingName` AS 存款類型,openDate AS 開戶日期,openMoney AS 開戶金額,balance AS 存款余額,IsReportLoss AS 賬戶狀態
FROM cardinfo,userInfo,`deposit`
WHERE WEEK(NOW())
AND IsReportLoss = 1
GROUP BY cardID
##5.查詢本月交易金額最高的卡號
SELECT DISTINCT cardid FROM `tradeinfo`
WHERE `transMoney` =(
SELECT MAX(transMoney) FROM tradeinfo
WHERE MONTH(NOW())
)
##6.查詢掛失的客戶
SELECT `customerName` AS 客戶姓名, telephone AS 聯系電話
FROM userinfo
WHERE `customerID` = (
SELECT `customerID` FROM `cardinfo`
WHERE `IsReportLoss` = 1
)

## 7.催款提醒
SELECT `customerName` AS 客戶姓名, `telephone` AS 聯系電話,balance AS 存款余額
FROM userinfo
INNER JOIN cardinfo ON `userinfo`.`customerID` = cardinfo.`customerID`
WHERE `balance`<200
##月末也就是30天后
AND DAY(`openDate`)>=30

######創建、使用客戶友好信息視圖
CREATE VIEW view_userInfo
AS
SELECT * FROM userInfo
SELECT * FROM view_userInfo

CREATE VIEW view_cardinfo
AS 
SELECT `cardID`AS 卡號,`curID` AS 貨幣種類,`savingID`AS 存款類型,`openDate`AS 開戶日期,`openMoney`AS 開戶金額,`balance`AS 余額,`password`AS 密碼,`IsReportLoss`AS 是否掛失,`customerID`AS 客戶編號
FROM `cardinfo`
SELECT * FROM view_cardinfo

CREATE VIEW view_tradeinfo
AS 
SELECT `transDate`AS 交易日期,`cardID`AS 卡號,`transType`AS 交易類型,`transMoney`AS 交易金額,`remark`AS 備注
FROM `tradeinfo`
SELECT * FROM view_tradeinfo


######使用事務模擬完成存款或取款業務

DELIMITER $$
CREATE PROCEDURE  usp_add_and_getMoney()
BEGIN
##設置全局錯誤總數默認為0
   DECLARE t_error INTEGER DEFAULT 0;
   ##設置如果有sqlexception就將全局錯誤總數為1
   DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
   ##關閉事務默認提交
   SET autocommit=0;
   ##開始事務
   START TRANSACTION;
    ##存款
    UPDATE cardInfo SET balance=balance+5000 WHERE cardID='7418529631012345';
    ##1.取款
    UPDATE cardInfo SET balance=balance-50 WHERE cardID='8529631234785623';
    IF t_error!=0 THEN
    ##中途發生錯誤,則回滾事物
    ROLLBACK;
    ELSE 
    ##提交事物
    COMMIT;
    ##開啟提交事物
    END IF; 
    SET autocommit=1;
END $$
DELIMITER ;
## 查看事務
CALL usp_add_and_getMoney();
SELECT * FROM cardInfo

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM