##建庫 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