第1关:实体完整性
任务描述
本关任务:定义供应商表的实体完整性。
相关知识
为了完成本关任务,你需要掌握:1. 数据库完整性,2.实体完整性,3.定义实体完整性,4.实体完整性检查和违约处理。
数据库完整性
数据库的完整性是指数据的正确性和相容性。数据的正确性是指数据是符合现实世界语义、反映当前实际状况的;数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的。
数据的完整性和安全性是两个既有联系又不尽相同的概念。数据的完整性是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据。数据的安全性是保护数据库防止恶意破坏和非法存取。安全性空值的防范对象是非法用户和非法操作,防止他们对数据库数据的非法存取。
为维护数据库的完整性,数据库管理系统必须诗选如下功能:
-
提供定义完整性约束条件的机制;
-
提供完整性检查的方法;
-
进行违约处理。
实体完整性
实体是一个数据对象,指的是客观存在并可以相互区分的事物,比如学生,老师等。一个实体在数据库中对应的是一条记录。
实体完整性在 MySQL 中的实现是通过主键约束和候选键约束实现的。实体完整性要求每一个表中的主键字段都不能为空或者重复的值。实 体完整性值表中行的完整性,要求表中的所有行都有唯一标识,称为主关键字。主关键字是否可以修改,或整个列是否可以被删除,取决于主关键字与其他表之间要求的完整性。
定义实体完整性
关系模型的实体完整性在 CREATE TABLE 中用 PRIMARY KEY 定义。对单属性构成的码有两种说明方法,一种是定义为列级约束条件,另一种是定义为表级约束条件。对多属性构成的码只有一种说明方法,即定义为表级约束条件。
例如将 Student 表中的 sno 属性在列级定义为主码:
CREATE TABLE Student(
sno char(9) PRIMARY KEY,
sname char(20) NOT NULL,
sage char(2)
);
将 Student 表中的 sno 属性在表级定义为主码:
CREATE TABLE Student(
sno char(9),
sname char(20) NOT NULL,
sage char(2),
PRIMARY KEY(sno)
);
将 Student 表中的 sno、cno 属性组定义为主码:
CREATE TABLE Student(
sno char(9) NOT NULL,
cno char(20) NOT NULL,
grade int,
PRIMARY KEY(sno,cno)
);
实体完整性检查和违约处理
实体完整性的规则如下:
-
实体完整性规则时针对基本关系而言的。一个基本表通常对应现实世界的一个实体集;
-
现实世界中的实体是可区分的,即他们具有某种唯一性标识;
-
相应的,关系模型中以主码作为唯一标识;
-
主码中的属性即主属性不能取空值。如果主属性取空值,就说明存在某个不可标识的实体,即存在不可区分的实体,则与第 2 点相矛盾。
用 PRIMARY KEY 短语定义了关系的主码之后,每当用户程序对基本表插入一条记录或对主码列进行更新操作时,关系数据库管理系统将按照上面完整性规则自动进行检查。包括:
-
检查主码值是否唯一,如果不唯一则拒绝插入或修改;
-
检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。
编程要求
在右侧编辑器补充代码,在右侧编辑器Begin-End
处补充代码,定义供应商表(supp)的实体完整性,表的信息如下所示:
字段名称 | 类型 | 备注 |
---|---|---|
suppkey | INTEGER | 供应商编号 |
name | CHAR(50) | 供应商名称 |
address | VARCHAR(80) | 供应商地址 |
nation | INTEGER | 国家编号 |
phone | CHAR(30) | 供应商电话 |
插入的数据如下表:
suppkey | name | address | nation | phone |
---|---|---|---|---|
134234 | 三禾竹木有限公司 | 中国 | 86 | 23845711 |
232345 | 绿瓯食品有限公司 | 阿富汗 | 93 | 23452453 |
183938 | 森海吊瓜专业合作社 | 日本 | 81 | 95234591 |
233332 | 丽水队长食品有限公司 | 马尔代夫 | 960 | 38745294 |
363639 | 晨光食品有限公司 | 泰国 | 66 | 47520450 |
150293 | 竹木制品有限公司 | 瑞典 | 41 | 23845725 |
359485 | 草苗食品有限公司 | 西班牙 | 34 | 49522345 |
134234 | 金色食品有限公司 | 以色列 | 972 | 32457290 |
观察上面表中的数据发现,suppkey的第一个和最后一个是一样的,违背了实体的完整性,因此输出的结果会报出有重复的值的错误:
Duplicate entry '134234' for key 'PRIMARY'
测试说明
平台会对你编写的代码进行测试:
预期输出:ERROR 1062 (23000) at line 2: Duplicate entry '134234' for key 'PRIMARY'
########## 定义供应商表的实体完整性 ##########
#请在此处添加实现代码
########## Begin ##########
create table supp(
suppkey integer not null,
name char(50) not null,
address varchar(80) not null,
nation integer not null,
phone char(30) not null,
primary key(suppkey)
);
########## End ##########