SQLSERVER2008实用教程实验参考答案(实验6) 下载本文

实验6 索引和数据完整性的使用 一、索引

当表中数据量很大时,合理建立索引,可以提高查询的效率。 1. 对YGGL数据库的Employees表中的DepartmentID列建立索引 CREATE INDEX em_d_ind ON Employees(DepartmentID) 2. 在Employees表的Name列和Address列上建立复合索引

CREATE INDEX em_na_ind ON Employees(Name,Address)

3. 对Departments表上的DepartmentName列建立唯一非聚集索引

CREATE UNIQUE INDEX de_n_ind ON Departments(DepartmentName)

4. 重建索引

ALTER INDEX ALL ON Employees REBUILD

5. 删除索引

DROP INDEX em_d_id ON Employees

一次删除多个索引

DROP INDEX Employees.em_d_ind,Employees.em_na_ind

6. 使用界面方式创建、删除索引

二、数据完整性

1. 创建一个表Employees5,只含有EmployeeID、Name、Sex和Education列。将Name设为主键,并对EmployeeID列进行UNIQUE约束。 验证主键约束和唯一约束。

CREATE TABLE Employees5 ( )

EmployeeID char(6) NOT NULL,

Name char(10) NOT NULL PRIMARY KEY, Sex bit,

Education char(4)

CONSTRAINT UK_id UNIQUE(EmployeeID)

2. 删除上例中创建的UNIQUE约束,删除后再验证唯一约束。

ALTER TABLE Employees5 DROP CONSTRAINT UK_id

3. 创建新表,使用复合列作为主键。验证复合主键

CREATE TABLE Employees6 ( )

EmployeeID char(6) NOT NULL, Name char(10) NOT NULL, Sex bit,

Education char(4)

PRIMARY KEY (EmployeeID,Name)

4. 使用ALTER TABLE语句为表Employees5表添加一个Address列,并为该列添加UNIQUE约束。

注意:如果原表中有数据,则需要将数据全部删除后才可以正确建立UNIQUE约束

ALTER TABLE Employees5 ADD Address varchar(40)

CONSTRAINT UK_AD UNIQUE(Address)

5. 使用ALTER TABLE语句为删除Employees5表添原有的主键,并重新为该表添加主键约束。

ALTER TABLE Employees5

DROP CONSTRAINT PK_Employees5

ALTER TABLE Employees5

ADD CONSTRAINT PK_Employees5 PRIMARY KEY(EmployeeID)

5. 使用图形界面方式为一个新表定义主键和UNIQUE约束,删除主键和UNIQUE约束。

6. 创建新表student,包含学号和性别两列,其中性别的值只能为“男”或“女”

CREATE TABLE student (

Sno char(10) NOT NULL,

Sex char(2) NOT NULL CHECK(Sex IN('男','女')) )

7. 创建新表Salary2,结构与Salary相同,增加约束条件:InCome列必须大于OutCome列。验证约束条件

CREATE TABLE Salary2 ( )

EmployeeID char(6) NOT NULL PRIMARY KEY, InCome float NOT NULL, OutCome float NOT NULL, CHECK (InCome>OutCOme)

8. 对Employees表进行更改,为其增加“DepartmentID”字段的CHECK约束,条件是DepartmentID值介于1和5之间。

ALTER TABLE Employees WITH CHECK ADD

CONSTRAINT

CK_Employees_DeID

CHECK(DepartmentID>=1

AND

DepartmentID<=5)

9. 创建一个规则对象,用以限制输入到该规则所绑定的列中的值只能是该规则中列出的值。部门名称列取值为‘财务部’‘研发部’‘人力资源部’‘销售部’

--解绑规则

EXEC sp_unbindrule 'Departments.DepartmentName'

GO

--删除规则

DROP RULE list_rule GO

--建立规则

CREATE RULE list_rule

AS @list IN ('财务部','研发部','人力资源部','销售部') GO

EXEC sp_bindrule 'list_rule','Departments.DepartmentName' GO

10. 建立一个规则对象,限制值在0~20之间,然后把它绑定到Employees表的WorkYear字段上 方法1:

CREATE RULE wk_rule

AS @workyear BETWEEN 0 AND 20 GO

EXEC sp_bindrule 'wk_rule','Employees.WorkYear' GO

方法2:

CREATE RULE wk_rule

AS @workyear>=0 AND @workyear <=20 GO

EXEC sp_bindrule 'wk_rule','Employees.WorkYear' GO

11. 删除规则

--解绑规则

EXEC sp_unbindrule 'Departments.DepartmentName' GO

--删除规则

DROP RULE list_rule GO

12. 创建一个表Salary3,要求所有Salary3表上EmployeesID列的值都要出现在Salary表中,利用参照完整性约束实现,要求当删除或修改Salary表上的EmployeeID列时,Salary3表中的EmployeeID值 也会随之变化。

初始化数据,将Salary表中的数据导入Salary3中,然后验证修改和删除操作

CREATE TABLE Salary3 (

EmployeeID char(6) NOT NULL PRIMARY KEY, InCome float NOT NULL, OutCome float NOT NULL, FOREIGN KEY(EmployeeID)

)

REFERENCES Salary(EmployeeID)

ON UPDATE CASCADE ON DELETE CASCADE

--初始化数据

INSERT INTO Salary3 SELECT * FROM Salary

13. 使用ATLER TABLE语句向Salary表中的EmployeeID列上添加一个外键,要求当Employees表中要删除或修改与EmployeeID值有关的行时,检查Salary表有没有与该EmployeeID值相关的记录,如果存在,则拒绝更新EmployeeS表

如果报错,尝试删除表中数据,重新导入样本数据。

--如果外键存在,则需要将其删除 ALTER TABLE Salary

DROP CONSTRAINT FK_Salary_Employees

--建立外键

ALTER TABLE Salary WITH CHECK ADD CONSTRAINT FK_Salary_Employees FOREIGN KEY (EmployeeID)

REFERENCES Employees(EmployeeID) ON UPDATE NO ACTION ON DELETE NO ACTION

14. 在资源管理器中建立Departments、Employees和Salary三个表之间的参照关系。 主键、外键、索引