mysql5
实验5 索引和数据完整性
实验类型:验证型实验课时: 2 指导教师:高素春
时间:2011年 4 月 14 日课次:第 5-6 节教学周次:第 7 周实验分室: 3#101 实验台号: B03 实验员:孔庆大
实验目的:
1.掌握索引的使用方法
2.掌握数据完整性的实现方法。
实验要求:
了解索引和数据完整性的相关知识。
实验内容:
1.创建索引
2.删除索引
3.数据完整性
实验步骤:
说明:按实验步骤对数据库YGGL中的三个表进行操作,三个表结构如下(具体参看实验2):Departments (DepartmentID,DepartmentName,Note)
Employees
(EmployeeID,Name,Sex,Birthday,Education,WorkYear,Address,PhoneNumber,DepartmentID) Salary(EmployeeID,InCome,OutCome)
要求:将实验步骤中紫色底纹部分填上正确答案。
1.创建索引
使用CREATE INDEX语句创建索引
(1)对YGGL数据库上的Employees表中的DepartmentID列建立索引。
USE YGGL;
CREATE INDEX depart_ind ON Employees(DepartmentID);
(2)在Employees表的Name列和Address列上建立复合索引。
CREATE INDEX Ad_ind ON Employees(Name,Address);
(3)在Departments表的DepartmentName列建立唯一性索引。
CREATE UNIQUE INDEX Dep_ind ON Departments (DepartmentName);
(4)使用SHOW INDEX语句查看Employees表的索引。
SHOW INDEX FROM Employees;
(5)使用SHOW INDEX语句查看Departments表的索引。
SHOW INDEX FROM Departments;
◆使用ALTER TABLE语句向表中添加索引
(1)向Employees表中的出生日期列添加一个唯一性索引,姓名列和性别列添加一个复合索引。
ALTER TABLE Employees
ADD UNIQUE INDEX date_ind(Birthday),
ADD INDEX na_ind(Name,Sex);
(2)删除表Departments的主键。
ALTER TABLE Departments
DROP PRIMARY KEY;
(3)将表Departments的DepartmentID列设为主键。
ALTER TABLE Departments
ADD PRIMARY KEY(DepartmentID);
◆在创建表时创建索引
创建与表Departments表相同结构的表Departments1,将DepartmentName列设为主键,DepartmentID列上建立一个索引
CREATE TABLE Departments1 (
DepartmentID char(3),
DepartmentName varchar(20),
Note text,
PRIMARY KEY (DepartmentName),
INDEX DID_ind(DepartmentID)
);
◆界面方式创建索引
使用界面方式在Employees表的PhoneNumber列上创建索引。
步骤如下:
登录MySQL Administrator,选中YGGL数据库中的Employees表,右击选择Edit Table,在表编辑界面中左击选中PhoneNumber列,单击Indices下方的“+”,键入索引名称INDEX_4,在Indices 框中选中INDEX_4,在Index Setting选项中选择索引类型,单击Index Columns栏右边的“+”,单击“Apply Changes”按钮,创建完成。
2.删除索引
(1)使用DROP INDEX语句删除表Employees上的索引depart_ind,。
DROP INDEX depart_ind ON Employees;
(2)使用ALTER TABLE删除表Departments的主键和索引Dep_ind。
ALTER TABLE Departments
DROP PRIMARY KEY,
DROP INDEX Dep_ind;
3.数据完整性
(1)创建一个表Employees3,只含EmployeeID,Name,Sex和Education列。将Name设为主键,EmployeeID为替代键
CREATE TABLE Employees3(
EmployeeID char(6) NOT NULL,
Name varchar(10) PRIMARY KEY,
Sex char(1),
Education char(4),
UNIQUE(EmployeeID)
);
(2) 创建一个表Salary1,要求所有Salary表上出现的EmployeeID都要出现在Salary1表中,利用完整性约束实现,要求当删除或修改Salary表上的EmployeeID列时,Salary1表中的EmployeeID值也会随之变化。
CREATE TABLE Salary1 (
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
)ENGINE=InnoDB DEFAULT CHARSET=gb2312;
(3) 将表Salary中的数据插入到表Salary1中。
Insert into salary1 select * from salary;
(4) 删除或更新表Salary中的数据时,观察表Salary1中的数据有何变化?
只有删除或更新Salary中的EmployeeID时,表Salary1中的EmployeeID才发生改变,删除或更新
其他数据时,表Salary1中的数据不发生变化。
(5)创建一个表Employees4,只考虑号码和性别列,性别只能包含男或女。
CREATE TABLE Employees4(
号码char(6) NOT NULL,
性别char(1) NOT NULL
CHECK(性别IN('男', '女'))
);
注意:CHECK完整性约束在目前的MySQL版本中只能被解析,而不能实现该功能
思考题:
1.添加主键和添加普通索引有什么区别?
答:主键一定是唯一性索引,唯一性索引并不一定就是主键。所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。
主键除了上述作用外,常常与外键构成参照完整性约束,防止出现数据不一致。数据库在设计时,主键起到了很重要的作用。主键可以保证记录的唯一和主键域非空,数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。一个表中可以有多个唯一性索引,但只能有一个主键主键列不允许空值,而唯一性索引列允许空值。
2.实验中遇到的问题及解决方法。
答:1.备份时mysqldump中没有空格,databases前注意有两个破折号。
2.任何队列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽
可能将操作移至等号右边。