--------------------------------------------------- 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 | 居住地址 | 可选输入 |
必填: 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王牌技术员联盟、期待与您交流!---------------------------------------------------------