导入脚本
首先直接打开TOAD,按照之前的配置,现在进入只需要输入账号密码即可连接(注意校园网)
在头歌中下载建库脚本和一个数据脚本(我这里下的大数据脚本,,没耐心的话不建议,导入太耗时间了)
那个.7z文件实际上就是由建表脚本和大数据脚本构成的,所以直接在这三个里下载即可
第一个是建表脚本(必下)第二个是大数据脚本,第三个是小数据脚本(二选一)
点击这里打开导入我们的sql脚本
首先导入建表脚本,如下图所示操作
然后导入数据脚本,我的大数据脚本导了半个小时。。。
检验约束
首先进入我们数据库表的浏览页面,editor是我们编写sql语句的地方,schema browser就是浏览页
主键约束
这项任务首先是找出这个表的主键,在数据库表浏览页中找到instructor然后找到primary约束
a.主键约束存在时插入违反约束的数据
已知主键为ID,那么只需要在表中找到一个ID,插入时保证ID与其相同即可达到破坏主键的效果(如果插入,则不再具有唯一性)
这里我选取这一行数据对应的 ID作为破坏的样本
在脚本中执行下列sql语句
insert into INSTRUCTOR VALUES(4233,'LiHua','Marketing',90000);
预期结果:根据数据库的限制,约束会正常生效阻止插入语句的执行
b.使主键无效,再次插入上一步的数据
为了谨慎一点,可以查看建表脚本查看详细信息
执行主键约束失效语句,首先查出对应约束的名字CONSTRAINT_NAME
select * from user_constraints where table_name='INSTRUCTOR';
然后根据这个name执行约束失效语句发现执行失败
原因:存在其他子约束于这个键,如果要使这个键的约束失效,必须让其他绑定这个键的约束先失效
找到关联这个键的其他约束
于是有了下面三行SQL,按顺序执行则不再报错(不确定大家的NAME是否相同,可以自行查找)
alter table ADVISOR disable constraint SYS_C0087270;
alter table TEACHES disable constraint SYS_C0087261;
alter table INSTRUCTOR disable constraint SYS_C0087252;
此时主键已经失效,可以执行a任务中的那一条插入语句
---->不再报错,证明主键约束确实效果如书上所说,成功插入数据
c.尝试恢复主键约束
只需要将上述语句的disable改为enable再执行即可
d.删除插入的数据,恢复主键约束
delete from INSTRUCTOR where ID=4233 and NAME='LiHua';
此时再恢复主键约束则不会再报错,为了表结构的正常,将另外两个子约束也恢复
alter table INSTRUCTOR enable constraint SYS_C0087252;
alter table ADVISOR enable constraint SYS_C0087270;
alter table TEACHES enable constraint SYS_C0087261;
外键约束
a.插入违反dept_name上外键约束的数据
根据我们对外键的理解,外键是我们插入的数据一定为另一张表的某个元组中出现过的数据
也就是说要在instructor中插入一个dept_name,而这个值不存在于department表中
(根据字面意思也很容易想到它的外键绑定在哪个表上)
然后我们进到department表中查看他的外键约束,验证我们的猜想正确~
这里准备数据也不用仔细思考,随便写个离谱的就行,因为导入的脚本都是正常数据
困,就多睡!我果断填上一个sleep(doge)
insert into INSTRUCTOR VALUES(42345,'LiHua','sleep',90000);
b.先在department中加一个院系,再在instructor中加一个对应院系的老师
insert into DEPARTMENT VALUES('Cybersecurity','Yifu',1);
insert into INSTRUCTOR VALUES(42345,'LiHua','Cybersecurity',90000);
c.删除刚刚添加到department中的数据
delete from DEPARTMENT where dept_name='Cybersecurity';
此时回到instructor表中发现对应的dept_name列值不见了
这里的原因就是因为对应外键的值已经不存在,建表时规定一旦删除则置空,所以显示上就没有数据了
d.先删掉外键约束,再新建外键约束,删除规则为no action
alter table INSTRUCTOR drop constraint SYS_C0087253;
no action就是字面意思,在delete时不做任何操作
ALTER TABLE INSTRUCTOR
add CONSTRAINT SYS_C0087253
FOREIGN KEY (dept_name) REFERENCES DEPARTMENT(dept_name) ;
f.删除院系
这里的意思应该是让我们再来一次b操作,然后再来一次c操作
找到我们的sql语句按顺序再执行一遍即可
我执行的sql顺序如下,我也不知道是不是正确的,因为查no action相关资料确实是不做任何操作,那么删除时会提示绑定了外键而无法删除(?) 不过确实冲突的是这个约束
delete from INSTRUCTOR where ID=42345 and NAME='LiHua';
# 因为之前还存留了这个id的元组,id为主键,得删掉才能插入
insert into DEPARTMENT VALUES('Cybersecurity','Yifu',1);
insert into INSTRUCTOR VALUES(42345,'LiHua','Cybersecurity',90000);
恢复
实验过程尽量保证操作前后数据库表的状态与开始的时候一致,因为我们对约束的命名与之前一致,所以删除约束的语句可以再次利用
alter table INSTRUCTOR drop constraint SYS_C0087253;
ALTER TABLE INSTRUCTOR
add CONSTRAINT SYS_C0087253
FOREIGN KEY (dept_name) REFERENCES DEPARTMENT(dept_name)
on delete set null;
unique约束
a.takes表中建立unique约束,使得每人每学期每课程只能修一个课程段
sec_id 表示课程段,semester表示学期,而ID可以唯一确定一名学生
所以我们添加unique约束需要对这三个属性进行添加
使得这三个属性在表中,不存在任一其他元组能与自身同时对应相同
ALTER TABLE TAKES
ADD CONSTRAINT SYS_C0087889 # 这里的名字自取
UNIQUE (ID,semester,sec_id,YEAR);
ALTER TABLE TAKES
ADD CONSTRAINT SYS_C0087889
UNIQUE (ID,semester,sec_id,YEAR) deferrable enable novalidate;
因为好像我导入的大数据脚本中已经有重复的数据导致第一个sql无法正常执行
通过自己写sql查找TAKES表中的数据发现确实如此,所以我添加约束时只能用第二种SQL
添加部分的意思是当前不检查唯一性,而在之后添加数据则会检查
对一个约束名字不要反复的创建删除,好像权限不够时做的不是真删除,而是假删,也就是约束名仍然存在,但是已经不起作用了,实在遇到了可以稍微再改一下约束名
b.插入违反unique条件的数据
这里我就举上面红框内的数据为例,由于course_id有外键约束,这里保证不破坏外键,在section表里找到一个sec_id为1,year为2006,semester为FALL的数据,填写相关信息插入(省事可以直接在takes插入脚本里找,因为takes可插入的一定满足外键了)
并且保证了这个课在他报的课中不存在
insert into TAKES VALUES('67340','626', '1', 'Fall', 2006, 'A+');
c.使得约束无效,再次执行插入
alter table TAKES disable constraint SYS_C0087889;
成功在约束失效时插入
d.删除unique约束
alter table TAKES drop constraint SYS_C0087889;
check约束
ALTER TABLE INSTRUCTOR
ADD CONSTRAINT SYS_C0087777
check(salary <= 500000);
INSERT into INSTRUCTOR VALUES('1086','simida','Math',555555);
自己判断实验是否正确的标准就是看报错是否冲突的使我们所检验的约束
这里的SYS_C0087777就是我刚刚添加的check约束,成功冲突证明实验成功,这个约束加在里面也无伤大雅,就不进行删除了..
标签:xtu,数据库,外键,约束,SYS,插入,INSTRUCTOR,主键,实验课 From: https://blog.csdn.net/G_yyyy/article/details/136790887