数据库实验11 SQL语言-数据库完整性

数据库实验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完成以下内容:

  1. 设置telphnoe默认值为00000000

    ALTER TABLE teacher modify telphone CHAR(12)default '0000000'; 
    

    ALTER TABLE teacher CHANGE COLUMN telphone telphone char(12) DEFAULT '00000000';
    

    检查:
    在这里插入图片描述

  2. 设置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 '男';
    

    再次检验:


可知设置成功。

  1. 设置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//

发布了68 篇原创文章 · 获赞 36 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/dingdingdodo/article/details/103016963