1. 熟练掌握SQL Server的使用方法。
  2. 熟练掌握使用SQL Server 20XX的对象资源管理器以及SQL 的DDL完成数据库的创建、删除和连接方法;数据表的建立、删除;表结构的修改。
  3. 加深对表的实体完整性、参照完整性和用户自定义完整性的理解。
二、实验内容
  1. 在以下实验中,使用学生-课程数据库,它描述了学生的基本信息、课程的基本信息及学生选修课程的信息。用对象资源管理器(企业管理器)与SQL语句分别完成。
    (1) 创建学生-课程数据库,该数据库名为student_xxxxxx。xxxxxx表示年级班级学号。17级1班12号,数据库名为student_170112;
    数据文件名为xxx_student_data、大小10M,日志文件名为xxx_student_log、大小5M的新数据库,其中XXX为本人姓名拼音首字母;
    (2) 创建学生关系表S、建课程关系表C 、学生-课程表SC,在表中加入至少4个元组,第一个为本人信息。

学生关系表S

学号

姓名

性别

年龄

所在系

Sno

Sname

Ssex

Sage

sdept

课程关系表C

课程号

课程名

先行课

学分

Cno

Cname

Cpno

ccredit

学生-课程表SC

学号

课程号

成绩

Sno

Cno

grade

  (3) 在表S上增加“出生日期”属性列以及Email地址列; 再删除表S的Email地址 属性列。
  (4) 备份数据库,再还原。

  1. 使用SQL进行数据完整性控制:包括三类完整性、check短语、constrain子句。
    (1) 在创建下列关系表时完成如下约束:定义实体完整性;参照完整性(外码、在删除S中的元组时级联删除SC中相应元组、当更新S中的Sno时同时更新SC中的Sno);用户定义完整性:学生年龄<30。
    (2) 修改S中的约束条件,年龄<40。
    (3) 用实验验证当操作违反了完整性约束时,系统如何处理?
    问题:外键与参照主键名是否一定要相同?
三、实验方法

  实验方法为利用SQL server的对象资源管理器和SQL语句对数据库与表进行基本操作,之后进行一些约束控制操作。

四、实验步骤
  1. 安装SQL server,直接在官网下载即可(本机安装的是 SQLServer2017-SSEI-Eval ),之后再安装SSMS(SQL Server Management Studio)对SQL server进行管理;
  2. 利用SSMS创建数据库;
  3. 接下来利用SQL语句创建三个表,并添加示例元组;
CREATE TABLE S(
	Sno VARCHAR(20),
	Sname VARCHAR(20),
	Ssex VARCHAR(4),
	Sage int CHECK (Sage<30),
	sdept VARCHAR(50),
	PRIMARY KEY(Sno)
);

INSERT INTO S (Sno, Sname, Ssex, Sage, sdept)
	VALUES
	(2536520115,'张钊','男',20,'铁道工程系'),
	(0691170151,'王岩','男',18,'通信工程系'),
	(8956170523,'杨静','女',19,'大数据系'),
	(4521170186,'李芳','女',21,'计算机科学系');
	
	
CREATE TABLE C(
	Cno VARCHAR(50),
	Cname VARCHAR(50),
	Cpno VARCHAR(50),
	ccredit INT,
	PRIMARY KEY(Cno)
);

INSERT INTO C(Cno, Cname, Cpno, ccredit)
	VALUES
	('2-1','数据结构','线性代数',2),
	('5-6','编译原理','汇编语言',3),
	('1-3','操作系统','离散数学',5),
	('8-5','计算机网','高等数学',3);
	
CREATE TABLE SC(
	Sno VARCHAR(20),
	Cno VARCHAR(50),
	grade int,
	PRIMARY KEY(Sno,Cno)
);

INSERT INTO SC(Sno, Cno, grade)
	VALUES
	(3901170115,'2-1',98),
	(8956170523,'8-5',95),
	(0691170151,'5-6',93),
	(4521170186,'1-3',100);
  1. 在表S上增加“出生日期”属性列以及Email地址列; 再删除表S的Email地址 属性列;
--在表S上增加“出生日期”属性列以及Email地址列; 
alter table S add birthDate date
alter table S add email varchar(50)

--再删除表S的Email地址 属性列
alter table S drop column email
  1. 根据实验要求对数据库中表进行数据完整性控制;
    5.1 参照完整性(外码、在删除S中的元组时级联删除SC中相应元组、当更新S中的Sno时同时更新SC中的Sno)。
/*在删除S中的元组时级联删除SC中相应元组、当更新S中的Sno时同时更新SC中的Sno*/
USE student_170115;    
GO    
ALTER TABLE SC 
ADD CONSTRAINT FK_S_SC FOREIGN KEY (Sno)     
    REFERENCES S (Sno)     
    ON DELETE CASCADE
	ON UPDATE CASCADE 
;    
GO  

用户定义完整性:学生年龄<30。
CREATE TABLE S(
	Sno VARCHAR(20),
	Sname VARCHAR(20),
	Ssex VARCHAR(4),
	Sage int CHECK (Sage<30),
	sdept VARCHAR(50),
	PRIMARY KEY(Sno)
);

  5.2 修改S中的约束条件,年龄<40;

  这里修改是属于修改已经创建过的约束条件,所以需要先检测该约束条件是否存在,如果存在则先删除再创建,不存在则直接创建。

  因为该约束为创建表时的约束,所以命名不是很清楚,则向表中添加一个不符合约束的元组,从而报错信息中会显示约束名。

mysql 项目实训7_《数据库与表的基本操作》


  获取约束名后即可进行检测删除操作,之后再创建新的约束条件。

--修改S中的约束条件,年龄<40
--修改check约束
use student_170115
go

--如果约束存在则先删除
if exists(select * from sysobjects where name='CK__S__Sage__412EB0B6')
alter table S drop constraint CK__S__Sage__412EB0B6;
go

--如果约束存在则先删除
if exists(select * from sysobjects where name='check_Sage')
alter table S drop constraint check_Sage;
go

--添加约束
alter table S
--with check --该约束是否应用于现有数据,with check表示应用于现有数据,with nocheck表示不应用于现有数据
add constraint check_Sage
check 
not for replication --当复制代理在表中插入或更新数据时,禁用该约束。
(Sage < 40);
go

  5.3 用实验验证当操作违反了完整性约束时,系统如何处理?
  系统不会完成该操作,会显示错误信息。
  比如在表S中Sage约束小于30时,创建一个Sage为35的元组,系统会显示如下错误信息。

INSERT INTO S (Sno, Sname, Ssex, Sage, sdept)
	VALUES
	(3698150211,'安鑫','男',35,'自动化系')

  问题:外键与参照主键名是否一定要相同?
  外键和相应的主键可以不同名,只要定义在相同域上即可。

五、实验结果

  实验结果为在SQL server数据库中利用对象资源管理器和SQL语句创建了三张符合约束条件的表.

六、实验结论

  实验通过对象资源管理器和SQL语句对SQL server数据库进行操作,完成对数据库和表的基本操作,最终能够成功创建三张符合题目约束条件的表,并且能够在表成功创建后对其约束条件进行更改。

七、实验小结

  通过本次实验,主要是学会了如何利用对象资源管理器和SQL语句对SQL server进行简单的数据库和表操作,完成一些CRUD操作、外键约束、check约束等操作;

  遇到的问题主要有:
  ① 创建数据库表示不知如何进行文件大小设定,和相关文件设置;
  解决方式:通过谷歌搜索可以直接利用图形界面在创建是填写,或者利用SQL语句进行设置。
  ② 在修改S表中的Sage约束时,新的约束无法起作用;
  解决方式:通过谷歌搜索得知,在对一个表中的已有约束进行修改时需要先删除原有约束,之后再创建新约束,但是删除原有约束需要原有约束名称,建表是创建的约束为默认名也不知,后来是直接新建一个不符合约束的元组在报错信息中得知原有约束的名称,之后在新建约束时先检测删除原有约束再创建新约束。

  实验中存在改进的地方主要是约束控制那里可以更加简略,部分SQL语句可以进一步简单化。