1实验目的
1.熟悉通过SQL对数据进行完整性控制。
2.完成书本上习题的上机练习。
2实验工具MYSQL
Mysql 命令行工具
3实验内容和要求
使用SQL对数据进行完整性控制(3类完整性、CHECK短语、CONSTRAIN子句、触发器)。用实验证实,当操作违反了完整性约束条件时,系统是如何处理的。根据以下要求认真填写实验报告,记录所有的实验用例。
4实验步骤
4.1三类完整性
4.1.1实体完整性
关系模式的实体完整性在create table中用primary key定义,
定义主码的方式分为定义为列级约束条件和定义表级约束条件两种。
(1)定义Student,并将其中的Sno属性定义为主码:
CREATE TABLE STUDENT(
SNO CHAR(9) PRIMARY KEY,
SNAME CHAR(8) NOT NULL,
SSEX CHAR(2),
SAGE SMALLINT,
SDEPT CHAR(20));
或者:
CREATE TABLE STUDENT(
SNO CHAR(9),
SNAME CHAR(8) NOT NULL,
SSEX CHAR(2),
SAGE SMALLINT,
SDEPT CHAR(20),
PRIMARY KEY(SNO)
);
创建成功后,查看student的结构如下:
验证参照性:
使用插入语句,插入已有的学号,按照主码的实体完整性约束,应该插入失败:
INSERT INTO STUDENT VALUES(‘201215121’,’李勇’,’男’,’20’,’CS’);
验证成功。
(2)定义表SC,将其中的属性Sno,Cno定义为主码:
CREATE TABLE SC(
SNO CHAR(9) NOT NULL,
CNO CHAR(4) NOT NULL,
GRADE SMALLINT,
PRIMARY KEY(SNO,CNO));
创建成功后,查看表的结构如下:
验证:
insert into SC values(‘201215122’,’2’,’90’);
4.1.2参照完整性
关系模型的参照完整性是再create table中用foreign key语句来定义的,并用references来知名外码参照宝的是哪些表的主码。
定义表SC,其中Sno参照表Student的主码Sno,Cno参照表Sourse的主码Cno。
CREATE TABLE SC(
SNO CHAR(9) NOT NULL,
CNO CHAR(4) NOT NULL,
GRADE SMALLINT,
PRIMARY KEY(SNO,CNO),
FOREIGN KEY(SNO) REFERENCES STUDENT(SNO),
FOREIGN KEY(CNO) REFERENCES COURSE(CNO)
);
创建成功后,表的结构如下:
分析:好像没用。Extra一列什么东西都没有。其实extra表示其他信息,和外码无关。
用[show create table sc;] 命令查看该表的所有结构,确实显示外键创建成功:
验证:
插入一条学号不属于student表的信息:
insert into SC values(‘201115122’,’2’,’90’);
验证成功,显示:
Cannot add or update a child row: a foreign key constraint fails (lab
.sc
, CONSTRAINT sc_ibfk_1
FOREIGN KEY (SNO
) REFERENCES student
(Sno
))
4.1.3用户自定义完整性
在create table中定义属性的同时,可以根据应用要求定义属性上的约束条件,即属性值约束,包括:
- 列值非空(not null)
- 列值唯一(unique)
- 检查列值是否满足一个条件表达式(check短语)
(1)不允许取空值:
定义SC表时,Sno、Cno和Grade属性都不允许取空值,在不特别声明的情况下,非码属性的值是允许取空值的。
CREATE TABLE SC(
SNO CHAR(9) NOT NULL,
CNO CHAR(4) NOT NULL,
GRADE SMALLINT NOT NULL,
);
懒得删除重建,直接使用alter修改约束条件:
ALTER TABLE SC
MODIFY GRADE SMALLINT NOT NULL;
结果如下:
验证:
INSERT INTO SC VALUES(‘201215122’,’2’,NULL);