实验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三个表之间的参照关系。 主键、外键、索引