黑马程序员之项目开发学习笔记:ATM取款机系统数据库设计

--------------------------------------------------- 2345王牌技术员联盟、2345王牌技术员联盟、期待与您交流!---------------------------------------------------------

某银行拟开发一套ATM取款机系统,实现如下功能:

1. 开户(到银行填写开户申请单, 卡号自动生成);

2. 取钱

3. 存钱

4. 查询余额

5. 转账(如使用一卡通代缴手机话费,个人股票交易等)

现要求对"ATM柜员机系统" 进行数据库的设计并实现,数据库保存在D:\bank目录下,文件增长率为15%。


用户信息表:userInfo  
customerID 顾客编号 自动编号(标识列),从1开始,主健
customerName 开户名 必填
PID 身份证号 必填,只能是18位或15位,身份证号唯一约束
telephone 联系电话 必填,格式为xxxx-xxxxxxxx或手机号13位
address 居住地址 可选输入

银行卡信息表:cardInfo  
cardID 卡号 必填,主键,银行的卡号规则和电话号码一样,一般前8位代表特殊含义,如某总行某支行等。假定该行要求其营业厅的卡号格式为:1010 3576 xxxx xxx开始,每4位号码有空格,卡号一般是随机产生
curType 货币种类 必填,默认为RMB
savingType 存款类型 活期/定期两便/定期
openDate 开户日期 必填,默认为系统当前日期
openMoney 开户金额 必填,不低于1元
balance 余额 必填,不低于1元,否则将销户
pass 密码 必填,6位数字,开户时默认为6个"8"
IsReportLoss 是否挂失 必填,是/否值,默认为"否"
customerID 顾客编号 外键,必填,表示该卡对应的顾客编号,一位顾客允许办理多张卡号


交易信息表:transInfo  
transDate 交易日期 必填,默认为系统当前日期
cardID 卡号 必填,外键,可重复索引
transType 交易类型 必填,只能是存入/支取
transMoney 交易金额 必填,大于0
remark 备注 可选输入,其他说明

设计ER图,建库,建表,加约束,建关系部分


建库语句:

CREATE DATABASE bankDB ON( NAME='...', FILENAME='...', SIZE=... , FILEGROWTH=...) LOG ON( ... )

FILENAME: 数据文件

FILEGROWTH: 文件增长率


建表语句:

CREATE TABLE 表名 ( customerID INT IDENTITY(1,1), customerNmae CHAR(8) NOT NULL, ......)

customerID INT IDENTITY(1,1): 自动编号,从1开始

NOT NUL: 非空/必填


建约束语句:

ALTER TABLE cardInfo ADD CONSTRAINT PK_cardID   PRIMARY_KEY(cardID),

                                           CONSTRAINT CK_cardID   CHECK(cardID LIKE '1010 3576 [0-9]...'),

                                           CONSTRAINT DF_curType DEFAULT('RMB') FOR curType,

                                           CONSTRAINT FK_customerID FOREIGN KEY(customerID) REFERENCES useInfo(customerID),

                                           CONSTRAINT UQ_PID UNIQUE(PID),

                                           ......

PK_cardID   PRIMARY_KEY(cardID):  主键约束

CONSTRAINT CK_cardID   CHECK(cardID LIKE '1010 3576 [0-9]...'): 检查约束

CONSTRAINT DF_curType DEFAULT('RMB') FOR curType: 默认约束

CONSTRAINT FK_customerID FOREIGN KEY(customerID) REFERENCES useInfo(customerID): 外键约束(建关系)

CONSTRAINT UQ_PID UNIQUE(PID): 唯一约束

                                                

customerID 顾客编号 自动编号(标识列),从1开始,主健
customerName 开户名 必填
PID 身份证号 必填,只能是18位或15位,身份证号唯一约束
telephone 联系电话 必填,格式为xxxx-xxxxxxxx或手机号13位
address 居住地址 可选输入
自动编号(标识列):建表时, IDENTITY(1,1)

必填: NOT NULL

18位或15位: check约束, len()函数

xxxx-xxxxxxxx或手机号13位: check约束,立刻‘[0-9][0-9]...'

 

插入测试数据,常规业务模拟,创建索引试图部分

子查询:

SELECT...FROM......WHERE transMoney = (SELECT......FROM...)

内部连接:

SELECT...FROM userInfo INNER JOIN cardInfo ON......

SQL编程:

DECLARE @inMoney money       声明变量

select @inMoney = sum(transMoney) from ... where(transType = ' 存入’)      给变量赋值的两种方法:SELECT或SET

视图:

CREATE VIEW view_userInfo       测试视图:SELECT ... FROM view_userInfo...

        AS

          ...--SQL语句 

GO


存储过程部分1:

创建存储过程:

CREATE PROCEDURE proc_takeMoney

     @card char(19),       存储过程的参数

     @type char(4),

     @inputPass char(6)=''       有默认值的参数,放在最后

AS

    ...----SQL语句

GO

调用存储过程:

EXEC proc_openAccount '李四', '321245678912345678', '0478-44443333',1,'定期'


存储过程部分2:

创建存储过程:

CREATE PROCEDURE proc_randCardID @RANDcARDid char(19) OUTPUT ...SELECT @r=RAND(随机种子)   例如:0.08233262 3215

set @randCardID = ...SUBSTRING(@tempStr,3,4)......

GO

说明:OUTPUT表示传出的参数

          RAND产生0-1的随机数

          0.08233262 3215  :截取小数点后8位作为卡号的后八位数卡号(4位一组,用空格隔开):1010 3576 0823 3262


调用存储过程:

DECLARE @mycardID char(19)  EXECUTE proc_CardID @mycardID OUTPUT

说明:EXECUTE proc_CardID @mycardID OUTPUT 调用带output输出参数的存储过程


开发流程:

第一步:利用Visio设计数据库的E-R图

第二步:利用SQL语句实现建库,建表,加约束,建关系

第三步:利用SQL语句插入测试数据,模拟常规业务操作

第四步:利用SQL语句创建索引和视图

第五步:利用SQL语句创建3个存储过程并测试

第六步:利用SQL语句创建转账事务并测试

第七步:利用SQL语句创建系统维护账号并授权


利用Visio设计数据库的E-R图:



利用SQL语句实现建库,建表,加约束,建关系

建库:检验数据库是否存在,如果为真,删除此数据库,然后建库bankDB

IF exists(SELECT * FROM sysdatabases WHERE name='bankDB") DROP DATABASE bankDB

          GO

           CREATE DATABASE bankDB ON

          (

                    NAME = 'bankDB_data',

                    FILENAME=' d:\bank\bankDB_data.mdf',

                    SIZE =3mb,

                    FILEGROETH = 15%

          )

          LOG ON

         (

              ......


建表:

USE bankDB\

GO

CREATE TABLE useInfo  --用户信息表

(

         customerID INT IDENTITY(1,1),

         customerName CHAR(8) NOT NULL,

         PID CHAR(18) NOT NULL,

         telephone VARCHAR(50)

)

GO


CREATE TABLE cardInfo ---银行卡信息表

(

    cardID char(19) NOT NULL,

    curType CHAR(5) NOT NULL,

    savingType CHAR(8) NOT NULL,

    openDate DATETIME NOT NULL,

    openMoney MONEY NOT NULL,

    balance MONEY NOT NULL,

    pass CHAR(6) NOT NULL,

    IsReportLoss BIT NOT NULL,

    customerID INT NOT NULL

)



CREATE TABLE transInfo   --交易信息表

(

   transDate  DATETIME NOT NULL,

   transType CHAR(4) not null,

   cardID CHAR(19) NOT NULL,

   transMoney MONEY NOT NULL,

   remark  TEXT

)

GO


第三步:利用SQL语句实现插入测试数据,常规业务操作

张三和李四开户:

SET NOCOUNT ON --不显示受影响的条数信息

INSERT INTO  userInfo(customerName, PID, telephone, address ) VALUES('张三','123456789012345','010-6789978','北京海淀')

INSERT INTO cardInfo(cardID,savingType,openMoney,balance,customerID) VALUES('1010 3576 1234 5678','活期',1000,1000,1)

INSERT INTO userInfo(customerName,PID,telephone) VALUES('李四',‘321245678912345678’,'0478-44443333')

INSERT INTO cardInfo(cardID,savingType,openMoney,balance,customerID) VALUSE('1010 3576 1212 1134','定期',1,1,2)

SELECT * FROM userInfo

SELECT * FROM cardInfo

GO





张三的卡号取款900元,李四的卡号存款5000元

/*-------------------------------------交易信息表插入交易记录------------------------------------------------------*/

INSERT INTO transInfo(transType, cardID,transMoney) VALUES('支取',1010 3576 1234 5678',900)


/*-------------------------------------更新银行卡信息表中的现有余额------------------------------------------------------*/

UPDATE cardInfo SET balance = balance - 900  WHERE cardID = '1010 3576 1234 5678'


/*-------------------------------------交易信息表插入交易记录------------------------------------------------------*/

INSERT INTO tranceInfo(tranceType,cardID,transMoney) VALUES('存入','1010 3576 1212 1134',5000)


/*-------------------------------------更新银行卡信息表中的现有余额------------------------------------------------------*/

UPDATE cardInfo SET balance = balance + 5000 WHERE cardID ='1010 3576 1212 1134'

GO


张三的卡号取款900元,李四的卡号存款5000元



--------------------------------------------------- 2345王牌技术员联盟、2345王牌技术员联盟、期待与您交流!---------------------------------------------------------

你可能感兴趣的:(黑马程序员SQL学习笔记)