实验九 完整性定义
1 实验目的与要求
(1)充分理解关系数据库中关于数据库完整性的概念。
(2)掌握实体完整性的定义方法。
(3)掌握参照完整性定义的方法。
(4)掌握用户自定义完整性的方法。
2 实验内容
重新创建BookDB数据库中5张基本表,要求完成以下完整性约束:
(1) 分别为BookClass表、Book表、Reader表建立主键,要求该约束为列级约束。
脚本:
BookClass表:
classNo char(3) not null primary key, --分类号
Book表:
bookNo char(10) not null primary key, --图书编号
Reader表:
readerNo char(8) not null primary key, --读者编号
(2) 给Reader表创建元组级约束,要求读者编号共8位,以“R”开头,后续四位为当前系统时间的年份,最后三位为流水号,如“R2008001”。
脚本:
constraint readerNoCK CHECK(reader贝多芬传读后感No like
'[R]'+convert(arxivchar(4),year(getdate()))+'[0-9][0-9][0-9]')
(3) 给Reader表中读者性别建立列级约束,要求性别为女或男。
脚本:
Sex char(2) null CHECK(x IN('男','女')), /*性 别*/
(4) 为Reader表创建列级约束,要求分别设置借书数量设置默认值0,身份证号要求唯一。
borrownum numeric(3) DEFAULT 0 not null, --借书数量
identitycard char(18) not null unique, --身份证号
(5) 为Reader表创建元组级约束,要求读者借书数量不得超过8本。
查询脚本:
constraint borrownumCK CHECK( borrownum>=0 and borrownum<=8)
(6) 为Book表创建列级约束,要求图书单价在10元至80元之间。
脚本:
price numeric(7, 2) CHECK (price>=10.00 AND price<=80.00) null, /*单价*/
(7) 为Book表创建列级约束,要求图书编号共10位,以“B”开头,后续四位为当前系统时间的年份,最后五位为流水号,如“B200101001”。
脚本:
bookNo char(10) constraint bookNoCK
CHECK(bookNo like'[B]'+convert(char(4),year(getdate()))+
'[0-9][0-9][0-9][0-9][0-9]') not星期一到星期天的英文 null,
(8) 为Book表创建表级约束,要求定义Book表的外键约束。
脚本:
constraint BookFK FOREIGN KEY(classNo)references Bookclass(classNo)
(9) 为Borrow表创建表级约束,要求图书归还日期大于借阅日期。
脚本:
constraint Borrowck check(returnDate>borrowDate),
(10) 为Borrow表创建列级约束,要求借阅日期的默认值为系统当前日期。
脚本:
borrowDate datetime DEFAULT getdat() not null, --借阅日期
(11) 为Borrow表创建表级约束,要求定义所有主键和外键约束。
脚本:
constraint Borrowpk primary key CLUSTERED(readerNo,bookNo,borrowDate),
常用英语口语CONSTRAINT BorrowFK1 FOREIGN KEY (readerNo) REFERENCES Reader (readerNo),
CONSTRAINT BorrowFK2 FOREIGN KEY (bookNo) REFERENCES Book (bookNo)
beenden完整脚本:
t nocount on
t dateformat ymd
u master
go
/*create databa*/
if exists(lect * from sysdatabas where name='BookDB')
drop databa BookDB
go
create databa BookDB
on primary
(name='BookDB',
filename='d:\sqlWork\BookDB.mdf',
size=3bowl的音标,
maxsize=10,
filegrowth=1)
log on constantly
(name=Booklog,
filename='d:\sqlWork\BookLog.ldf',
thickening size=1,
maxsize=5,
filegrowth=1)
go
/*data mydataba*/
u BookDB
go
u BookDB
/*图书分类表*/
print 'creat table BookClass'
go
CREATE TABLE BookClass(
classNo char(3) not null primary key, /*图书分类号*/
className varchar(20) not null /*图书分类名称*/bbm
)
go
/*图书表*/
print 'create Book'
go
create table Book(
bookNo char(10) not null primary key, /*图书编号*/
check(bookNo like '[B]'+convert(char(4),year(getdate()))
+'[0-9][0-9][0-9][0-9][0-9]'),
classNo char(3) not null, /*分类号*/
bookName varchar(40) not null, /*图书名称*/
authorName varchar(8) not null, /*作者姓名*/
publishingName varchar(20) null, /*出版社名称*/
publishingNo char(17) null, /*出版社号*/
price numeric(7,2) null
check(price between 10 and 80), /*单价*/
publishingDate datetime null, /*出版日期*/
shopDate datetime null, /*入库时间*/
shopNum numeric(3) null, /*入库数量*/
constraint BookFK foreign key(classNo) references BookClass(classNo)
)
Go
/*读者表*/
print 'create Reader'
go
create table Reader(
readerNo char(8) not null primary key,2017年高考 /*读者编号*/
check(readerNo like '[R]'+convert(char(4),year(getdate()))
+'[0-9][0-9][0-9]'),
readerName varchar(8) not null, /*姓名*/
x char(2) null /*性别*/
check(x in('女','男')),
identifycard char(18) unique null, /*身份证号*/
workUnit varchar(50) null, /*工作单位*/
borrowCount tinyint default 0 null, /*借书数量*/
constraint borrownumCK check(borrowcount<=8)
)
go
/*借阅表*/
print 'create Borrow'
go
create table Borrow(
readerNo char(8) not null, /*读者编号*/
bookNo char(10) not null, /*图书编号*/
borrowDate datetime default getdate() not null, /*借阅日期*/
shouldDate datetime not null, /*应归还日期*/
returnDate datetime null, /*归还日期*/
constraint BorrowPK primary key
clustered(readerNo,bookNo,borrowDate),
constraint BorrowFk1 foreign key(readerNo)