数据库作业

本文详细介绍了数据库管理中参照完整性的设置,包括级联删除和更新,以及如何添加和删除约束。同时,展示了触发器的使用,如记录分数更改历史和确保教授工资不低于4000元的规则。内容涵盖ALTER TABLE语句、CREATE TABLE语句和触发器的创建及应用。
摘要由CSDN通过智能技术生成

https://www.cnblogs.com/xijin-wu/p/5632775.html

https://www.cnblogs.com/liuqiyun/p/8603088.html

https://blog.csdn.net/weixin_46218781/article/details/105934703

首先把sno和cno改成bigint类型的 不然后面的实验做不下去

1

老师的代码:

在这里插入图片描述

但是在已经创建好sc表的情况下 如何再添加参照完整性呢

格式为:
alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名)

alter table sc
--当学生表里的学生被删除或修改 成绩表也相应被删除或修改
--课程表如果课程被删除了 这个成绩表里对应学生的记录不应被删除应该拒绝删除 但是如果课程号改了这里也相应被改
add constraint sno1 foreign key(sno) references student(sno)  on delete cascade   on update cascade,
    constraint cno1 foreign key(cno) references course(cno) on delete no action    on update cascade
	

select* from information_schema.constraint_column_usage 可以查看所有的约束

在这里插入图片描述

如何删除约束呢

在这里插入图片描述

现在数据库里的数据:

在这里插入图片描述

现在来试试删除学生和课程的记录会怎么样

先来看看把李勇的学号改了会发什么什么变化

在这里插入图片描述

再看看把course表的cno改了 sc表会发生什么变化

在这里插入图片描述

现在课被删除了 那么sc表的学生成绩记录会被删除吗

在这里插入图片描述

执行失败了

看看学生信息被删除了会不会级联删除

在这里插入图片描述

可以看到sc表里面李勇的信息也没了

2

在这里插入图片描述

create table dept (
	deptno varchar(20)  primary key,
	dname varchar(20) unique not null,
)
delete from dept   --因为前面测试了数据 现在清空一下表

insert into dept
values ('001','haha')

select * from dept

在这里插入图片描述

delete from dept   --因为前面测试了数据 现在清空一下表

insert into dept
values ('001','haha')

insert into dept
values ('002','haha')  --部门名称和上面相同报错
select * from dept

在这里插入图片描述

不过为什么为空不报错

在这里插入图片描述

3

在这里插入图片描述

因为学生表以前也建过了 删掉重建太可惜了
所以也不按老师的语句写了

在这里插入图片描述

男女是可以正常添加进去的

这样就不行了

在这里插入图片描述

附代码

alter table student  
drop checksex      --前面做了测试 这里删掉

alter table student 
add constraint checksex
	check (ssex in ('男','女'))

insert into student
values ('20121122','小王子','haha',18, 'cs')

select * from Student

4

在这里插入图片描述

select * from sc

alter table sc 
	add constraint checkgrade 
		check (grade>=0 and grade<=100);

insert into sc
values(4,201215122,100)
select * from sc

在这里插入图片描述

可以看到100是可以插入进去的

再试试101 --发生冲突

在这里插入图片描述

改成90又能正常执行了

在这里插入图片描述

5

在这里插入图片描述

这个性别的约束已经写好了

没有找到姓名不能为空的写法 右键设计里面自己手动去掉勾吧 然后年龄要改成int类型

alter table student
add constraint checksno check (sno>90000 and sno < 99999),
	constraint checkage check (sage<30)

在这里插入图片描述

报错了 解决方法:https://blog.csdn.net/weixin_46218781/article/details/105934703

在这里插入图片描述

右键新建约束

在这里插入图片描述

嗯。。。为啥能成功

在这里插入图片描述

懒得弄了 就这样吧

年龄的约束正常

在这里插入图片描述

6

在这里插入图片描述

alter table student
drop constraint checksex

然后再测试一下

在这里插入图片描述

7

在这里插入图片描述

 ALTER TABLE Student
 DROP checkage;
 
 ALTER TABLE Student
  ADD CONSTRAINT checkage CHECK(Sage < 40);

在这里插入图片描述

在这里插入图片描述

8

第一步

create table scu(
	sno bigint primary key,
	cno bigint ,
	oldgrade int,
	newgrade int
)

第二步

create trigger sct
on sc
after update
as
begin
	if( select grade from inserted)>1.1*(select grade from deleted) 	
	begin
		Insert into scu
		Values((select sno from deleted),(select cno from deleted),(select grade from deleted),(select grade from inserted))
	end
end

第三步

update sc
set Grade=140 where cno=2 and sno =201215121  --添加到新表

update sc
set Grade=81 where cno=3 and sno=201215121  --不会添加到新表

9

第一步

create table teacher(
	id  varchar(10) primary key,
	职位 varchar(20),
	工资 int
)

--后面会对001进行修改
insert into teacher 
values ('001','教授',1000) 

第二步

create trigger Insert_OR_Update_Sal
on teacher
for update,insert
as
begin
	
		update teacher 
		set 工资=4000 where (
		(select 工资 from inserted)<4000 and (select 职位 from inserted)='教授')
end


第三步

update teacher
set 工资=1000 where teacher.id=001    --查询一下发现工资变成了4000

insert into teacher 
values ('002','教授',1000)     --变4000

insert into teacher 
values ('003','讲师',1000)

insert into teacher 
values ('004','教授',5000)

select * from teacher

10 老师代码

【实验过程】
操作1:显式说明参照完整性的违约处理示例
       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) 
		ON DELETE CASCADE        /*级联删除SC表中相应的元组*/
             ON UPDATE CASCADE,      /*级联更新SC表中相应的元组*/
           FOREIGN KEY (Cno) REFERENCES Course(Cno)	                    
             ON DELETE   NO ACTION 	
                 /*当删除course 表中的元组造成了与SC表不一致时拒绝删除*/
             ON UPDATE   CASCADE   
      	  /*当更新course表中的cno时,级联更新SC表中相应的元组*/
           );
操作2:建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码
    CREATE TABLE DEPT
        (   Deptno  NUMERIC(2),
            Dname  CHAR(9)  UNIQUE NOT NULL/*要求Dname列值唯一, 并且不能取空值*/
            Location  CHAR(10),
            PRIMARY KEY (Deptno)
         );
操作3:Student表的Ssex只允许取“男”或“女”。
     CREATE TABLE Student
          ( Sno  CHAR(9) PRIMARY KEY,
            Sname CHAR(8) NOT NULL,                     
            Ssex  CHAR(2)  CHECK (Ssex IN (‘男’,’女’)),           
                                      /*性别属性Ssex只允许取'男'或'女' */
            Sage  SMALLINT,
            Sdept  CHAR(20)
          );
操作4:SC表的Grade的值应该在0100之间。
   CREATE TABLE  SC
         (  Sno     CHAR(9) ,
            Cno    CHAR(4),
	Grade   SMALLINT CHECK (Grade>=0 AND Grade <=100)/*Grade取值范围是0到100*/
            PRIMARY KEY (Sno,Cno),
            FOREIGN KEY (Sno) REFERENCES Student(Sno),
            FOREIGN KEY (Cno) REFERENCES Course(Cno)
           );
操作5:建立学生登记表Student,要求学号在90000~99999之间,姓名不能取空值,年龄小于30,性别只能是“男”或“女”。
    CREATE TABLE Student
      (   Sno  NUMERIC(6)
          CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
          Sname  CHAR(20)  
          CONSTRAINT C2 NOT NULL,
          Sage  NUMERIC(3)
          CONSTRAINT C3 CHECK (Sage < 30),
          Ssex  CHAR(2)
          CONSTRAINT C4 CHECK (Ssex IN ( ‘男’,'女')),
          CONSTRAINT StudentKey PRIMARY KEY(Sno)
        );
操作6:去掉例操作5对 Student表中对性别的限制。
        ALTER TABLE Student 
        DROP CONSTRAINT C4;
操作7:修改表Student中的约束条件,要求学号改为在900000~999999之间,年龄由小于30改为小于40
可以先删除原来的约束条件,再增加新的约束条件
      ALTER TABLE Student
        DROP CONSTRAINT C1;
        ALTER TABLE Student
        ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999),
        ALTER TABLE Student
        DROP CONSTRAINT C3;
        ALTER TABLE Student
        ADD CONSTRAINT C3 CHECK(Sage < 40);
操作8:当对表SC的Grade属性进行修改时,若分数增加了10%则将此次操作记录到下面表中:
     SC_U(Sno,Cno,Oldgrade,Newgrade), 其中Oldgrade是修改前的分数,Newgrade是修改后的分数。
	CREATE TRIGGER  SC_T		
	AFTER UPDATE OF Grade ON SC
     REFERENCING
	      OLD row  AS  OldTuple,
	      NEW row AS  NewTuple
	FOR EACH ROW 	
	WHEN (NewTuple.Grade >= 1.1*OldTuple.Grade)
	    INSERT INTO SC_U(Sno,Cno,OldGrade,NewGrade)  
VALUES(OldTuple.Sno,OldTuple.Cno,OldTuple.Grade,NewTuple.Grade)
操作9:定义一个BEFORE行级触发器,为教师表Teacher定义完整性规则“教授的工资不得低于4000元,如果低于4000元,自动改为4000元”。    
	    CREATE TRIGGER Insert_Or_Update_Sal 
         BEFORE INSERT OR UPDATE ON Teacher   /*触发事件是插入或更新操作*/
          FOR EACH ROW        /*行级触发器*/
          BEGIN               /*定义触发动作体,是PL/SQL过程块*/
             	IF (new.Job='教授') AND (new.Sal < 4000) 
             	THEN  new.Sal :=4000;                
           	 END IF;
        END;                               	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值