约束的级联操作

级联删除:

级联删除操作是存在于主表和从表关系之中,当操作了主表中的数据,则要求字表中的数据也随之更新或者删除,这样的操作叫作级联操作,级联操作分为级联删除,级联更新,级联查询(这个一般使用程序实现)

删除数据表
DROP TABLE sc PURGE;
DROP TABLE course PURGE;
DROP TABLE teacher PURGE;
DROP TABLE student PURGE;

创建数据表
CREATE TABLE sc(
sno VARCHAR2(10),
cno VARCHAR2(10),
score NUMBER(4,2),
创建sno的外键约束
CONSTRAINT fk_sno FOREIGN KEY(sno) REFENCES student(sno),
创建cno的外键约束
CONSTRAINT fk_cno FOREIGN KEY(cno) REFENCES course(cno)
);

CREATE TABLE course(
cno VARCHAR2(10),
cname VARCHAR2(20),
tno VARCHAR2(10),
CONSTRAINT pk_cno PRIMARY KEY(cno)
);

CREATE TABLE student(
sno VARCHAR2(10),
sname VARCHAR2(20),
sage NUMBER(2),
ssex VARCHAR(5),
CONSTRAINT pk_sno PRIMARY KEY(sno)
);
CREATE TABLE teacher(
tno VARCHAR2(10),
tname VARCHAR2(20),
CONSTRAINT pk_tno PRIMARY KEY(tno)
);

约束的级联操作
发现在创建数据表的时候,必须先创建主表,再创建字表,所以要把子表的创建代码放到后面

删除主表中的数据

DELETE FROM course WHERE cno='coo1';

约束的级联操作
发现不能删除数据,因为该数据被字表引用了,如果要删除有两种方案:

方案一:先删除字表中引用的数据,再删除主表数据
方案二:使用级联删除

一:
DELETE FROM sc WHERE cno='c001';
DELETE FROM course WHERE cno='c001';

约束的级联操作

二:
使用级联删除,就是在删除主表数据的时候同时删除字表中引用的数据,
但是在创建外键的时候要指定使用级联删除的操作

删除数据表
DROP TABLE sc PURGE;
DROP TABLE course PURGE;
DROP TABLE teacher PURGE;
DROP TABLE student PURGE;

创建数据表

CREATE TABLE student(
sno VARCHAR2(10),
sname VARCHAR2(20),
sage NUMBER(2),
ssex VARCHAR(5),
CONSTRAINT pk_sno PRIMARY KEY(sno)
);
CREATE TABLE teacher(
tno VARCHAR2(10),
tname VARCHAR2(20),
CONSTRAINT pk_tno PRIMARY KEY(tno)
);

CREATE TABLE course(
cno VARCHAR2(10),
cname VARCHAR2(20),
tno VARCHAR2(10),
CONSTRAINT pk_cno PRIMARY KEY(cno)
);
CREATE TABLE sc(
sno VARCHAR2(10),
cno VARCHAR2(10),
score NUMBER(4,2),
创建sno的外键约束
CONSTRAINT fk_sno FOREIGN KEY(sno) REFENCES student(sno),
创建cno的外键约束 需要使用级联删除的操作
CONSTRAINT fk_cno FOREIGN KEY(cno) REFENCES course(cno) ON DELETE CASCADE
);

插入数据:
INSERT INTO student VALUES('s001','张三',23,'男');
INSERT INTO student VALUES('s002','李四',23,'男');
INSERT INTO student VALUES('s003','王五',23,'男');
INSERT INTO student VALUES('s004','赵六',23,'男');
commit;

INSERT INTO teacher VALUES('t001','斯巴达');
INSERT INTO teacher VALUES('t002','尼古拉斯');
INSERT INTO teacher VALUES('t003','雅典娜');
commit;

INSERT INTO course VALUES('c001','java web','t002');
INSERT INTO course VALUES('c002','oracle','t002');
INSERT INTO course VALUES('c003','c#','t003');
INSERT INTO course VALUES('c004','javascript','t001');
commit;

INSERT INTO sc VALUES('s001','c001',78);
INSERT INTO sc VALUES('s002','c002',80);
INSERT INTO sc VALUES('s003','c001',98);
INSERT INTO sc VALUES('s004','c003',67);
INSERT INTO sc VALUES('s001','c004',67);
INSERT INTO sc VALUES('s003','c003',67);
INSERT INTO sc VALUES('s002','c001',67);
commit;

创建cno的外键约束 指定级联删除
CONSTRAINT fk_cno FOREIGN KEY(cno) REFERENCES course(cno) ON DELETE CASCADE

DELETE FROM course WHERE cno='c001';

约束的级联操作
约束的级联操作
级联删除就是删除主表中的数据,则子表中引用的数据也随之删除

级联更新:

级联更新就是更新主表中的数据,则子表中引用的数据也随之更新

更新主表数据

UPDATE course SET cno='c011' WHERE cno='c001';

约束的级联操作
此时不能直接更新主表数据,因为主表中的数据被引用了,如果实现更新有两种方案:

1.先更新字表中的数据,在更新主表中的数据先取消字表对主表数据的引用

2.使用级联更新操作,在创建外键约束的时候指定

方案一:
UPDATE sc SET cno=null WHERE cno='c001';
UPDATE course SET cno='c011' WHERE cno='c001';
UPDATE sc SET cno='c011' WHERE cno IS NULL;
方案二:使用级联操作
使用级联更新操作,当更新了主表数据之后对应在字表中的数据也随之更新
在创建约束的时候使用关键字'ON UPDATE CASCADE'指定为级联更新

创建cno的外键约束
CONSTRAINT fk_cno FOREIGN KEY(cno) REFERENCES course(cno) ON UPDATE CASCADE

约束的级联操作
Oracle不支持级联更新,但是MySQL支持,如果想要在Oracle中使用级联更新需要使用触发器实现

总结:

1.先创建主表再创建子表

2.先删除子表再删除主表

3.要先删除子表数据再删除主表数据或者使用级联操作

4.先更新子表数据再更新主表数据或者使用级联操作