数据库实验11 SQL语言-数据库完整性
一.实验环境:
MYSQL WORKBENCH
二.实验内容与完成情况:
5.
创建一个教职工表teacher(tno,tname,tage,telphone,tsex,id),将教工号tno设置为主键,性别默认值为"男"
create table teacher
(
tno CHAR(7) primary key, #设置主键
tname VARCHAR(10),
tage INT,
telphone CHAR(12),
tsex char(2) default '男', #性别默认值为"男"
tid VARCHAR(20)
)engine=InnoDB;
6.
根据教职工表teacher完成以下内容:
-
设置telphnoe默认值为00000000
ALTER TABLE teacher modify telphone CHAR(12)default '0000000';
或
ALTER TABLE teacher CHANGE COLUMN telphone telphone char(12) DEFAULT '00000000';
检查:
-
设置tsex的check检查约束为:输入值只能是“男”或“女”
ALTER TABLE teacher modify tsex char(2) default '男' check(tsex='男' or tsex='女');
设置check后,进行检验,发现check并没有起效果:
主要原因在于MYSQL不支持check操作,因此在这里用enum设置只能是"男"或“女”:
ALTER TABLE teacher CHANGE COLUMN tsex tsex enum('男','女') default '男';
再次检验:
可知设置成功。
-
设置id的位数为15位或者18位,每位都是数字
delimiter // create trigger tr_id after insert on teacher #创建触发器 for each row begin declare iresult int default 0; if (length(new.tid)!=15 and length(new.tid)!=18) #如果id长度不为15或18则报错 then SIGNAL SQLSTATE'45000'SET MESSAGE_TEXT = 'The length is not allowed'; end if; select new.tid regexp '^[0-9]*$' into iresult; #如果id内容存在非数字则报错 if (iresult=0) then SIGNAL SQLSTATE'45000' SET MESSAGE_TEXT ='id must be consisted of nums'; end if; END//
检查:
插入长度不为15和18的元素:插入失败
插入长度为15和18的元素但包含非数字:插入失败
插入长度为15且均为数字的数据:插入成功
7
设有订报管理子系统数据库DingBao中的表PAPER,表内容如下:
请在掌握数据库完整性知识的基础上,根据表的内容设定尽可能多的完整性规则用于该表,用于保障该表的正确性和完整性。
约束性:
-
设置报纸编号为主码,并且pno的长度必须为6,同时是由组数字组成
-
约束ppr大小必须大于0
-
设置报纸的名称不可以为空且不可以相同
代码如下(其中一种实现):
create table paper
(
pno char(7) primary key ,
pna char(20) unique not null,
ppr float not null
)engine=InnoDB;
delimiter //
create trigger trig after insert on paper #创建触发器
for each row
begin
declare iresult int default 0;
if (length(new.pno)!=6 or ppr<0)
then
SIGNAL SQLSTATE'45000';
end if;
select new.pno regexp '^[0-9]*$' into iresult; #如果id内容存在非数字则报错
if (iresult=0)
then
SIGNAL SQLSTATE'45000';
end if;
END//