Oracle - 完整性约束与级联删除【建表】

sqlplus中直接导入sql文件:@文件路径sql

sql developer中直接将sql文件拖入工做表命令行处,点击执行数据库



sql文件:网络

/*建立学生表STUDENT*/
CREATE TABLE STUDENT (
    SNO           CHAR(6) PRIMARY KEY,
    SNAME         VARCHAR2(12),
    DEPT          VARCHAR2(20),
    SEX           VARCHAR2(3),
    BIRTHDAY      DATE,
    TOTALCREDIT   NUMBER(3),
    REMARKS       VARCHAR2(50)
);
Insert into STUDENT (SNO,SNAME,DEPT,SEX,BIRTHDAY,TOTALCREDIT,REMARKS)
values ('201801','张一','计算机','男','01-1月-89',52,null);
Insert into STUDENT (SNO,SNAME,DEPT,SEX,BIRTHDAY,TOTALCREDIT,REMARKS) 
values ('201802','李一','物联网','女','10-2月-89',45,'团支书');
Insert into STUDENT (SNO,SNAME,DEPT,SEX,BIRTHDAY,TOTALCREDIT,REMARKS) 
values ('201803', '王一', '通讯工程','女','08-3月-89',58,'转专业');
Insert into STUDENT (SNO,SNAME,DEPT,SEX,BIRTHDAY,TOTALCREDIT,REMARKS) 
values ('201804','赵一','软件工程','男','21-4月-89',48,null);
Insert into STUDENT (SNO,SNAME,DEPT,SEX,BIRTHDAY,TOTALCREDIT,REMARKS)
values ('201901','张二','计算机','男','01-5月-90',50,'学生会主席');
Insert into STUDENT (SNO,SNAME,DEPT,SEX,BIRTHDAY,TOTALCREDIT,REMARKS) 
values ('201902','李二','物联网','女','10-6月-90',54,'文艺部部长');
Insert into STUDENT (SNO,SNAME,DEPT,SEX,BIRTHDAY,TOTALCREDIT,REMARKS) 
values ('201903', '王二', '网络工程','男','08-7月-90',48,null);
Insert into STUDENT (SNO,SNAME,DEPT,SEX,BIRTHDAY,TOTALCREDIT,REMARKS) 
values ('201904','赵二','软件工程','男','21-8月-90',48,'软1班长');
Insert into STUDENT (SNO,SNAME,DEPT,SEX,BIRTHDAY,TOTALCREDIT,REMARKS)
values ('201905','张三','冶金','男','01-9月-90',50,'辅导员助理');
Insert into STUDENT (SNO,SNAME,DEPT,SEX,BIRTHDAY,TOTALCREDIT,REMARKS) 
values ('201906','李三','化工','女','10-10月-90',51,null);

/*建立课程表COURSET*/
CREATE TABLE COURSE (
    CNO      CHAR(3),
    CNAME    VARCHAR2(30),
    TERM     CHAR(1),
    CTIME    NUMBER(3),
    CREDIT   NUMBER(2),
    PRIMARY KEY (CNO)
);
Insert into COURSE (CNO, CNAME, TERM, CTIME, CREDIT) values ('C1','离散数学','2',48,2);
Insert into COURSE (CNO, CNAME, TERM, CTIME, CREDIT) values ('C2','大学语文','1',32,2);
Insert into COURSE (CNO, CNAME, TERM, CTIME, CREDIT) values ('C3','数据库概论','4',64,4);
Insert into COURSE (CNO, CNAME, TERM, CTIME, CREDIT) values ('C4','C++','1',64,4);
Insert into COURSE (CNO, CNAME, TERM, CTIME, CREDIT) values ('C5','JAVA','4',52,4);
Insert into COURSE (CNO, CNAME, TERM, CTIME, CREDIT) values ('C6','WEB','3',52,4);
Insert into COURSE (CNO, CNAME, TERM, CTIME, CREDIT) values ('C7','软件工程','2',64,4);
Insert into COURSE (CNO, CNAME, TERM, CTIME, CREDIT) values ('C8','大学英语','1',64,4);

/*建立成绩表SCORE*/
CREATE TABLE SCORE (
    SNO     CHAR(6),
    CNO     CHAR(3),
    GRADE   NUMBER(4,1),
    PRIMARY KEY (SNO,CNO), /*CONSTRAINT PK_SC PRIMARY KEY(SNO,CNO)*/
    CONSTRAINT FK_SNO FOREIGN KEY (SNO) REFERENCES STUDENT (SNO),
    CONSTRAINT FK_CNO FOREIGN KEY (CNO) REFERENCES COURSE (CNO)
);
Insert into SCORE (SNO,CNO,GRADE)  values ('201801','C1',70);
Insert into SCORE (SNO,CNO,GRADE)  values ('201801','C2',80);
Insert into SCORE (SNO,CNO,GRADE)  values ('201802','C5',90);
Insert into SCORE (SNO,CNO,GRADE)  values ('201803','C7',60);
Insert into SCORE (SNO,CNO,GRADE)  values ('201804','C2',81);
Insert into SCORE (SNO,CNO,GRADE)  values ('201804','C5',90);
Insert into SCORE (SNO,CNO,GRADE)  values ('201804','C8',100);
Insert into SCORE (SNO,CNO,GRADE)  values ('201901','C1',75);
Insert into SCORE (SNO,CNO,GRADE)  values ('201901','C5',80);
Insert into SCORE (SNO,CNO,GRADE)  values ('201902','C2',82);
Insert into SCORE (SNO,CNO,GRADE)  values ('201902','C6',72);
Insert into SCORE (SNO,CNO,GRADE)  values ('201903','C8',85);
Insert into SCORE (SNO,CNO,GRADE)  values ('201904','C1',75);
Insert into SCORE (SNO,CNO,GRADE)  values ('201904','C2',80);
Insert into SCORE (SNO,CNO,GRADE)  values ('201904','C7',100);

注意事项spa

在建表时声明完整性约束时:constraint XXX foreign key(YYY) reference TABLE_NAME(ZZZ)命令行

constraint XXX必不可少;code

虽然直接使用reference可直接完成约束,但在后期没法完成级联删除操做!数学



 

级联删除:

ALTER TABLE SCORE DROP CONSTRAINT FK_CNO;

ALTER TABLE SCORE ADD CONSTRAINT XXXX FOREIGN KEY(CNO) REFERENCES COURSE(CNO) ON DELETE CASCADE;

DELETE FROM COURSE WHERE CNO='C8'

注意事项class

当主表与附表之间存在关联时,附表上的数据能够直接被修改,软件

可是主表中的与附表关联部分的数据不可被直接修改/删除(完整性约束)软件工程

当须要删除主表中的内容时,须要使用上述的级联删除方法:

  • 首先在附表中删除与主表之间的约束关系
  • 再从新添加"处理后的约束关系"(该约束关系包括四部分:约束关系别名+外键+依赖的主表的某个字段+"ON DELETE CASCADE")
  • 再次删除主表中的元素时便可正常删除(附表中对应的元素也会被一并删除