`

oracle中使用on delete cascade

阅读更多

 

oracle中使用on delete cascade和on delete set null来建立外键

 

其面我们介绍了创建外键约束时如果使用oracle默认的创建方式,在删除被参照的数据时,将无法被删除,这一点在oracle9i中给了我们更多灵活的选择,我们可是使用on delete cascade和 on delete set null关键字来决定删除被参照数据时是否要将参照这个数据的那些数据一并删除,还是将那些参照这条数据的数据的对应值赋空。

 

例如下面这两个表中分别存的时员工的基本信息和公司的部门信息。我们为

create table dept

(deptno number(10) not null,

deptname varchar2(30) not null,

constraint pk_dept primary key(deptno));

create table emp

( empno number(10) not null,

fname varchar2(20) ,

lname varchar2(20) ,

dept number(10) ,

constraint pk_emp primary key(empno));

 

然后我们现在分别使用这两个关键字来增加外键试一下,首先我们来试一下on delete cascade

 

alter table emp

add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete cascade;

先增加外键。然后插入数据。

insert into dept values(1,’销售部’);

insert into dept values(2,’财务部’);

insert into emp values (2,’Mary’,'Song’,1);

insert into emp values (3,’Linda’,'Liu’,2);

insert into emp values (4,’Linlin’,'Zhang’,1);

然后现在我要删除销售部,会有什么后果呢?

delete from dept where deptno = 1;

我们发现除了dept中的一条数据被删除了,emp中两条数据也被删除了,其中emp中的两条数据是参照了销售部的这条数据的,这就很容易理解on delete cascade了。

 

接下来我们再来看on delete set null,顾名思义了,这种方式建立的外键约束,当被参照的数据被删除是,参照该数据的那些数据的对应值将会变为空值,下面我们还是通过试验来证明on delete set null作用:

首先恢复刚才的那几条数据,然后更改约束:

alter table emp

add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete set null;

然后我们在执行删除操作:

delete from dept where deptno = 1;

你也会发现除了dept中的销售部被删除以外,emp中参照这条数据的两条数据的dept的值被自动赋空了,这就是on delete set null的作用了。

 

使用on delete set null有一点需要注意的是,被参参照其他表的那一列必须能够被赋空,不能有not null约束,对于上面的例子来说是emp中dept列一定不能有not null约束,如果已经定义了not null约束,又使用了on delete set null来删除被参照的数据时,将会发生:ORA-01407: 无法更新 (”DD”.”EMP”.”DEPT”) 为 NULL的错误。

 

总的来讲on delete cascade和on delete set null的作用是用来处理级联删除问题的,如果你需要删除的数据被其他数据所参照,那么你应该决定到底希望oracle怎么处理那些参照这些即将要删除数据的数据的,你可以有三种方式:

禁止删除。这也是oracle默认的

将那些参照本值的数据的对应列赋空,这个需要使用on delete set null关键字

将那些参照本值的数据一并删除,这个需要使用on delete cascade关键字

 

 

 

分享到:
评论
2 楼 jio2006 2012-10-15  
都是基础,不错
1 楼 jio2006 2012-10-15  

相关推荐

    从mysql转换到oracle数据库.docx

    8. 将 `ON DELETE CASCADE ON UPDATE CASCADE` 替换成 `ON DELETE CASCADE ON UPDATE CASCADE`。 9. 将外键前的 `KEY cq_formid (cq_formid)` 去掉。 10. 将 `CONSTRAINT 0_99 FOREIGN` 改成 `CONSTRAINT fk_99 ...

    oracle中如何创建约束?

    例如,在提供的部分内容中,`emp`表的`jno`字段通过`constraint fk_jid references job(jid) on delete cascade`定义了一个外键约束,该约束引用了`job`表的`jid`字段。这意味着如果`job`表中的一个记录被删除,那么...

    利用 Oracle 系统触发器防止误删除表操作

    Oracle作为一款广泛使用的数据库管理系统,提供了丰富的功能来保障数据安全。其中,系统触发器是Oracle提供的一种强大工具,能够帮助管理员监控并干预特定的数据库操作,有效防止误操作导致的数据丢失。 #### 问题...

    Oracle最常用的语句

    `alter table 表名 add constraint 外键约束 foreign key (外键列) references 主表(主键列) on delete cascade;` 创建外键约束,当主表中的记录被删除时,子表中的相关记录也会被级联删除。 13. **连接列**: `...

    24.Oracle的主键和外键1

    1. **创建表时指定主键**:在CREATE TABLE语句中使用`PRIMARY KEY`关键字定义主键字段。 2. **修改已存在的表添加主键**:使用ALTER TABLE语句添加`CONSTRAINT`并指定主键。 接着,我们来看外键。外键是用来连接两...

    Oracle学习笔记 Oracle学习笔记

    在Oracle学习过程中,掌握基础的命令与权限管理是至关重要的。以下内容将围绕Oracle数据库的基础操作、用户管理以及权限控制等方面展开。 ### 基础操作 1. **连接与断开** - 使用`conn[ect] username/password[as...

    oracle_dynamic_sql.rar_Dynamic SQL ORAC_oracle_oracle dynam_orac

    在Oracle中,可以使用`ON DELETE CASCADE`约束来实现这一功能。但是,在某些情况下,特别是当级联关系复杂或者需要在删除前进行额外检查时,动态SQL就派上用场了。 例如,假设我们有两张表,一个是`employees`,另...

    oracle training

    - 创建具有外键约束的表:`create table address ( id int not null, street varchar2(20) not null, person_id references person(id) on delete cascade , primary key (id));` - **删除表**: - `drop table ...

    4.oracle 再次学习1

    ALTER TABLE STUDENTS ADD CONSTRAINT FK_STU FOREIGN KEY (CLASS_ID) REFERENCES CLASS (ID) ON DELETE CASCADE; ``` 这些基本的Oracle SQL命令是数据库管理员日常工作中不可或缺的部分,它们涵盖了查询信息、...

    mysql转换到oracle数据库

    - 将级联操作(`ON DELETE CASCADE ON UPDATE CASCADE`)保留。 - 移动外键定义到最后一步执行。 - **其他细节**: - `mediumblob`转换为`blob`。 - 非主键字段的`NOT NULL`约束需要去除。 - 外键约束移动到...

    oracle的基本文档

    如果需要在外键关联的主表记录被删除时自动删除从表中的相关记录,可以使用`ON DELETE CASCADE`: ```sql ALTER TABLE stuinfo ADD CONSTRAINT stu_fk FOREIGN KEY (stu_id) REFERENCES students(id) ON DELETE ...

    oracle学习笔记

    对于多个字段的外键,需要指定 `FOREIGN KEY (字段名) REFERENCES 表名(字段) [ON DELETE CASCADE]`,`ON DELETE CASCADE` 表示父表记录删除时,子表关联记录也随之删除。 7. 删除带有约束的表:`DROP TABLE 表名 ...

    解析Oracle中多表级联删除的方法

    在创建表时,可以通过定义外键约束并指定`ON DELETE CASCADE`选项来实现级联删除。例如: ```sql CREATE TABLE "U_WEN_BOOK"."FARTAB" ( "FAR_ID" NUMBER(10) NOT NULL, "FAR_NAME" VARCHAR2(10), "OTHER_NAME" ...

    Oracle触发器实验报告

    通过创建外键并定义ON UPDATE CASCADE,当employees表中的department_id被更新时,如果在departments表中没有对应项,系统会尝试在departments表中创建相应的记录。这就解释了为什么在更新触发器执行后,employees表...

    (word完整版)Oracle测试题及答案.doc

    `cno`和`bno`都是外键,分别引用`card`表的`cno`和`books`表的`bno`,并设置了`on delete cascade`,这意味着如果在父表中删除一个记录,相关的子表记录也会被删除。`primary key(cno,bno)`定义了复合主键,确保每张...

    Oracle sql宝典

    级联更新和级联删除可通过 `DEFERRABLE` 和 `ON DELETE CASCADE` 设置。 - **唯一性约束**:确保某一列的值全库唯一,如 `CREATE TABLE only_test(id number primary key, name varchar2(20) unique)`。 - **检查...

    Oracle数据库中的级联查询、级联删除、级联更新操作教程

    然而,通过设置`ON DELETE CASCADE`,可以使得删除父表记录时,所有相关联的子表记录也会被自动删除。例如: ```sql CREATE TABLE TB_STUDENT ( ID NUMBER NOT NULL, NAME VARCHAR2(50), CLASS_ID NUMBER, ...

    顶级讲师oracle全部课件,最全文档,涉及oracle所有操作,开发必备

    * 创建触发器:create trigger 触发器名 before/after insert/update/delete on 表名 for each row as $$ begin ... end; 复杂查询 Oracle 的复杂查询提供了强大的查询能力,允许开发者创建复杂的查询语句,例如:...

    Oracle基本语句

    ALTER TABLE stuinfo ADD CONSTRAINT stu_fk FOREIGN KEY (stu_id) REFERENCES students(id) ON DELETE CASCADE; ``` 这条语句添加了一个名为 stu_fk 的外键约束在 stuinfo 表的 stu_id 列上,引用 students 表的 id...

    SQL、ORACLE与数据库教学.pdf

    SQL语言提供了多种数据完整性约束机制,包括REFERENCE子句、ON DELETE CASCADE和ON UPDATE CASCADE子句等。 四、关系操作 关系操作是关系数据库管理系统中的一种重要操作,用于实现数据的插入、删除、更新和查询等...

Global site tag (gtag.js) - Google Analytics