Oracle外键级联删除和级联更新

1 级联删除

Oracle在外键的删除上有NO ACTION(类似RESTRICT)、CASCADE和SET NULL三种行为。

下面以学生-班级为例说明不同情况下的外键删除,学生属于班级,班级的主键是学生的外键。

-- 班级表
CRATE TABLE TB_CLASS
(
  ID    NUMBER NOT NULL, --班级主键
  NAME  VARCHAR2(50), --班级名称
  CONSTRAINT PK_TB_CLASS PRIMARY KEY (ID)
);
 
-- 学生表
CREATE TABLE TB_STUDENT
(
  ID        NUMBER NOT NULL,   --学生主键
  NAME      VARCHAR2(50),      --学生姓名
  CLASS_ID  NUMBER,            --学生所属班级,外键
   
  --主键约束
  CONSTRAINT PK_TB_STUDENT PRIMARY KEY (ID),
   
  --外键约束
  --设置级联删除为NO ACTION
  CONSTRAINT FK_TB_STUDENT_CLASS_ID FOREIGN KEY (CLASS_ID) REFERENCES TB_CLASS (ID)
);
 
-- 添加班级数据
INSERT INTO TB_CLASS (ID, NAME) VALUES (1, '一班');
INSERT INTO TB_CLASS (ID, NAME) VALUES (2, '二班');
INSERT INTO TB_CLASS (ID, NAME) VALUES (3, '三班');
 
-- 添加学生数据
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (1, '小明', 1);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (2, '小刚', 1);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (3, '小王', 1);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (4, '二明', 2);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (5, '二刚', 2);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (6, '二王', 2);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (7, '大明', 3);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (8, '大刚', 3);
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (9, '大王', 3);

 初始班级数据

\"></p>
<p>初始学生数据</p>
<p><img style=数据库中保存具有层级关系的数据时,表的外键引用同一个表的主键。这时候无法用触发器实现级联更新。

猜你喜欢

转载自a475334705.iteye.com/blog/2291534