数据库笔记07:实施数据完整性

举报
howard2005 发表于 2021/12/30 01:20:47 2021/12/30
【摘要】 /***************************  第七单元:实施数据完整性 ***************************/ /* 预备任务:创建数据库“选课”,包含一个数据文件与一个日志文件 */ CREATE   DATABASE  选...
/***************************
 第七单元:实施数据完整性
***************************/

/* 预备任务:创建数据库“选课”,包含一个数据文件与一个日志文件 */

CREATE   DATABASE  选课
ON   PRIMARY
(
     NAME = 选课 _data ,
     FILENAME = 'D:\选课_data.mdf' ,
     SIZE = 5 MB ,
     MAXSIZE = 50 MB ,
     FILEGROWTH = 10 %
)
LOG   ON
(
     NAME = 选课 _log ,
     FILENAME = 'D:\选课_log.ldf' ,
     SIZE = 2 MB ,
     MAXSIZE = 20 MB ,
     FILEGROWTH = 2 MB
);

USE  选课
GO

/* 任务:创建数据表(CREATE TABLE) */

--1. 创建Department表(表设计参看P127表6-1)

CREATE   TABLE   Department
(
     DepartNo   nvarchar ( 2 )   NOT   NULL ,
     DepartName   nvarchar ( 20 )   NOT   NULL
);

--2. 创建Course表(表设计参看P127表6-2)

CREATE   TABLE   Course
(
     CouNo   nvarchar ( 3 )   NOT   NULL ,
     CouName   nvarchar ( 30 )   NOT   NULL ,
     Kind   nvarchar ( 8 )   NOT   NULL ,
     Credit   decimal ( 2 , 1 )   NOT   NULL ,
     Teacher   nvarchar ( 20 )   NOT   NULL ,
     DepartNo   nvarchar ( 2 )   NOT   NULL ,
     SchoolTime   nvarchar ( 10 )   NOT   NULL ,
     LimitNum   decimal ( 5 , 0 )   NOT   NULL ,
     WillNum   decimal ( 5 , 0 )   NOT   NULL ,
     ChooseNum   decimal ( 5 , 0 )   NOT   NULL  
);

--3. 创建Class表(表设计参看P127表6-3)

CREATE   TABLE   Class
(
     ClassNo   nvarchar ( 8 )   NOT   NULL ,
     ClassName   nvarchar ( 20 )   NOT   NULL ,
     DepartNo   nvarchar ( 2 )   NOT   NULL
);

--4. 创建Student表(表设计参看P127表6-4)

CREATE   TABLE   Student
(
     StuNo   nvarchar ( 8 )   NOT   NULL ,
     StuName   nvarchar ( 10 )   NOT   NULL ,
     Pwd   nvarchar ( 8 )   NOT   NULL ,
     ClassNo   nvarchar ( 8 )   NOT   NULL
);

--5. 创建StuCou表(表设计参看P127表6-5)

CREATE   TABLE   StuCou
(
     StuNo   nvarchar ( 8 )   NOT   NULL ,
     CouNo   nvarchar ( 3 )   NOT   NULL ,
     WillOrder   tinyint   NOT   NULL ,
     State   nvarchar ( 2 )   NOT   NULL ,
     RandomNum   nvarchar ( 50 )   NULL  
);

/******************************
 第七单元有四项任务:

1、创建约束(删除约束)
(1)主键约束(PRIMARY KEY)
(2)外键约束(FOREIGN KEY...REFRENCES...)
(3)唯一约束(UNIQUE)
(4)检查约束(CHECK)
(5)默认约束(DEFAULT)
2、创建默认值(删除默认值)
3、创建规则
4、创建标识列
******************************/

/* 任务:创建主键约束 */

/*
   语法格式:ADD CONSTRAINT <约束名> <约束类型> (约束列)
*/

--1. 给Department表的DepartNo字段创建主键约束

ALTER   TABLE   Department
ADD   CONSTRAINT   pk_department   PRIMARY   KEY   ( DepartNo );

-- 大家可以打开Department表,输入两条记录,系部编号相同,单击保存按钮,会弹出错误提示框。
 
--2. 给Course表的CouNo字段创建主键约束

ALTER   TABLE   Course
ADD   CONSTRAINT   pk_course   PRIMARY   KEY   ( CouNo );

--3. 给Class表的ClassNo字段创建主键约束

ALTER   TABLE   Class
ADD   CONSTRAINT   pk_class   PRIMARY   KEY   ( ClassNo );

--4. 给Student表的StuNo字段创建主键约束

ALTER   TABLE   Student
ADD   CONSTRAINT   pk_student   PRIMARY   KEY   ( StuNo );

--5. 给StuCou表的StuNo与CouNo字段创建主键约束

ALTER   TABLE   StuCou
ADD   CONSTRAINT   pk_stucou   PRIMARY   KEY   ( StuNo ,   CouNo );

--6. 删除StuCou表的主键约束,然后再次创建

ALTER   TABLE   StuCou
DROP   CONSTRAINT   pk_stucou ;

ALTER   TABLE   StuCou
ADD   CONSTRAINT   pk_stucou   PRIMARY   KEY   ( StuNo ,   CouNo );

/* 任务:创建外键约束 */

--1. 给Student表的ClassNo创建外键约束

ALTER   TABLE   Student
ADD   CONSTRAINT   fk_student   FOREIGN   KEY   ( ClassNo )   
REFERENCES   Class   ( ClassNo );

-- 在数据库关系图里创建Class表与Student表之间的永久性联系

--2. 给Course表的DepartNo创建外键约束

ALTER   TABLE   Course
ADD   CONSTRAINT   fk_course   FOREIGN   KEY   ( DepartNo );
REFERENCES   Department ( DepartNo );

-- 在数据库关系图里创建Department表与Course表之间的永久性联系


--3. 给StuCou表的StuNo与CouNo创建外键约束

ALTER   TABLE   StuCou
ADD   CONSTRAINT   fk_stucou_stuno   FOREIGN   KEY   ( StuNo )
REFERENCES   Student ( StuNo );

ALTER   TABLE   StuCou
ADD   CONSTRAINT   fk_stucou_couno   FOREIGN   KEY   ( CouNo )
REFERENCES   Course   ( CouNo );

-- 在数据库关系图里创建StuCou表与Student表和Course之间的永久性联系


--4. 给Class表的DepartNo创建外键约束

ALTER   TABLE   Class
ADD   CONSTRAINT   fk_class   FOREIGN   KEY   ( DepartNo )
REFERENCES   Department   ( DepartNo );

-- 在数据库关系图里创建Department表与Class表之间的永久性联系

/* 任务:创建唯一约束 */

--1. 给Course表的CouName创建一个唯一索引

ALTER   TABLE   Course
ADD   CONSTRAINT   un_couname   UNIQUE   ( CouName );

--2. 给Course表插入两条记录,故意让课程名相同

/* 因为Course表的DepartNo是外键,参照Department表的主键DepartNo,必须先给主键设置值 */

INSERT   INTO   Department   VALUES ( '01' , '信息工程系' );
INSERT   INTO   Department   VALUES ( '02' , '建筑工程系' );

INSERT   INTO   Course   VALUES   ( '001' , '大型数据库开发' , '信息技术' , 3 , '李小平' , '01' , '周二5-6节' , 20 , 43 , 20 );
INSERT   INTO   Course   VALUES   ( '002' , '大型数据库开发' , '工程技术' , 2 , '王彦荣' , '02' , '周三3-4节' , 25 , 30 , 25 );

/* 任务:创建检查约束 */

--1. 约束Student表的StuNo字段,只允许8位数字,并且不可以为8个0

ALTER   TABLE   Student
ADD   CONSTRAINT   ck_stuno   CHECK   ( StuNo   LIKE   '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'   AND   StuNo <> '00000000' );

--2. 给Student表输入一条记录,学号为'00000000'

/* 因为Student表的ClassNo是外键,参照Class表的主键ClassNo,必须先给主键设置值 */

INSERT   INTO   Class   VALUES   ( '20150001' , '15软件1班' , '01' );

INSERT   INTO   Student   VALUES   ( '00000000' , '黄飞鸿' , 'FAFFGS02' , '20150001' );

--3. 给Student表插入一条记录,学号为'2015x001'

INSERT   INTO   Student   VALUES   ( '2015x001' , '张三丰' , 'GHET56KO' , '20150001' );

--4. 删除Student表对于StuNo的检查约束

ALTER   TABLE   Student
DROP   CONSTRAINT   ck_stuno ;

--5. 选课表StuCou的报名志愿最多只允许5个

ALTER   TABLE   StuCou
ADD   CONSTRAINT   ck_willorder   CHECK   ( WillOrder   IN   ( 1 , 2 , 3 , 4 , 5 ));

--6. 给Student表插入一条记录

INSERT   INTO   Student   VALUES   ( '20150001' , '李晓红' , 'QW45FG57' , '20150001' );

--7. 给选课表StuCou插入一条记录,故意让WillOrder为6

INSERT   INTO   StuCou   ( StuNo , CouNo , WillOrder , State )   VALUES   ( '20150001' , '001' , 6 , '报名' );

--8. 给Course表的CouNo字段设置检查约束,只能由数字构成,并且不能全为0

ALTER   TABLE   Course
ADD   CONSTRAINT   ck_couno   CHECK   ( CouNo   LIKE   '[0-9][0-9][0-9]'   AND   CouNo <> '000' );

--9. 给Course表插入一条记录,故意设置CouNo为'000'

INSERT   INTO   Course   VALUES   ( '000' , 'Java程序设计' , '信息技术' , 2 , '李晓云' , '01' , '周三3-4节' , 25 , 35 , 25 );

/* 任务:创建默认约束 */

--1. 给选课表StuCou的State字段设置默认约束,默认值为“待定”

ALTER   TABLE   StuCou
ADD   CONSTRAINT   df_state   DEFAULT   ( '待定' )   FOR   State ;

--2. 给选课表StuCou插入一条记录,不设置State字段的值

INSERT   INTO   StuCou   ( StuNo , CouNo , WillOrder )   VALUES   ( '20150001' , '001' , 2 );

--3. 显示StuCou表的全部记录

SELECT   *   FROM   StuCou ;

--4. 删除StuCou表对State字段的默认约束

ALTER   TABLE   StuCou
DROP   CONSTRAINT   df_state ;

/* 任务:创建默认值(在SQL Server后续版本里已经删除此功能,建议使用默认约束) */

--1. 给Course表的Teacher字段创建一个默认值对象

CREATE   DEFAULT   df_teacher   AS   '待定' ;

--2. 将默认值对象df_teacher绑定到Course表的Teacher字段

sp_bindefault   df_teacher , 'Course.Teacher'

--3. 验证:给Course表插入一条记录,不设置Teacher字段的值

INSERT   INTO   Course   ( CouNo , CouName , Kind , Credit , DepartNo , SchoolTime , LimitNum , WillNum , ChooseNum )  
VALUES   ( '002' , 'Java程序设计' , '信息技术' , 4 , '01' , '周四3-4节' , 30 , 50 , 30 );

--4. 查看Course表的全部记录

SELECT   *   FROM   Course ;

--5. 给Course表的Teacher字段解除默认值绑定

sp_unbindefault   'Course.Teacher'


--6. 删除默认值对象df_teacher

DROP   DEFAULT   df_teacher ;

/* 任务:创建规则(删除规则) */

--1. 针对Course表创建规则,保证Credit字段只能取1.5、2、2.5、3、3.5、4、4.5、5

CREATE   RULE   credit_rule
AS  @ Credit   IN   ( 1.5 , 2 , 2.5 , 3 , 3.5 , 4 , 4.5 , 5 );

--2. 将规则对象credit_rule绑定到Course表的Credit字段

sp_bindrule   credit_rule , 'Course.Credit'

--3. 验证:给Course表插入一条记录,故意设置学分为2.2

INSERT   INTO   Course   VALUES   ( '003' , 'Web前端开发技术' , '信息技术' , 2.2 , '李小龙' , '01' , '周四3-4节' , 30 , 50 , 30 );

--4. 将Course表的Credit解除规则绑定

sp_unbindrule   'Course.Credit'

--5. 删除规则credit_rule

DROP   RULE   credit_rule ;  


/* 任务:使用标识列 */

--1. 创建Test表(id是标识列,seed是201501,increment是1)

CREATE   TABLE   Test
(
     id   int   NOT   NULL   IDENTITY ( 201501 , 1 ),
     name   nvarchar ( 8 )   NOT   NULL ,
     gender   nvarchar ( 1 )   NOT   NULL ,
     age   smallint   NOT   NULL
);

--2. 给Test表插入几条记录,不用管标识列

INSERT   INTO   Test   ( name , gender , age )   VALUES   ( '张三丰' , '男' , 18 );
INSERT   INTO   Test   ( name , gender , age )   VALUES   ( '李晓霞' , '女' , 19 );
INSERT   INTO   Test   ( name , gender , age )   VALUES   ( '甄云文' , '女' , 18 );
INSERT   INTO   Test   ( name , gender , age )   VALUES   ( '杨臣刚' , '男' , 20 );
INSERT   INTO   Test   ( name , gender , age )   VALUES   ( '王丽霞' , '女' , 18 );

--3. 查看Test表的全部记录

SELECT   *
FROM   Test ;

文章来源: howard2005.blog.csdn.net,作者:howard2005,版权归原作者所有,如需转载,请联系作者。

原文链接:howard2005.blog.csdn.net/article/details/79447992

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。