数据库级联操作

Oracle的级联操作是为了处理,在删除主表数据时,从表外键数据该怎么处理,有如下三种情况:

1、SET NULL:

此关键字用于表示当删除主表中被引用列的数据时,将子表中相应引用列的值设置为NULL值。这种情况要求子表中的引用列支持NULL值。

2、CASCADE:

此关键字用于表示当删除主表中被引用列的数据时,级联删除子表中相应的数据行。

3、NO ACTION:

约束后面省略ON DELETE的情况,此关键字用于表示当删除主表中被引用列的数据时,如果子表的引用列中包含该值,则禁止该操作执行。

下面通过例子展示:

第一种情况:

–创建主表

SQL> create table father(

2 f_id number(10) primary key,

3 f_name varchar2(20)

4 );

表已创建。

–创建从表

SQL> create table child(
2 c_id number(10) primary key,
3 f_id number(10),
4 c_name varchar2(20),
5 constraint ch_fa foreign key (f_id) references father(f_id)
6 on delete set null
7 );

–插入数据

SQL> insert into father values (1,’cupid’);

已创建 1 行。

SQL> insert into father values (2,’dorria’);

已创建 1 行。

SQL> insert into child values (1,1,’jack’);

已创建 1 行。

SQL> insert into child values (2,2,’rose’);

已创建 1 行。

commit;

提交完成。

SQL> delete from father where f_id=1;

已删除 1 行。

SQL> commit;

提交完成。

SQL> select * from father;

  F_ID F_NAME

    2 dorria

SQL> select * from child;

  C_ID      F_ID C_NAME

    1            jack
    2          2 rose

第二种情况:

–创建主表

SQL> create table father_1(

2 f_id number(10) primary key,

3 f_name varchar2(20)

4 );

表已创建。

–创建从表

SQL> create table child_1(
2 c_id number(10) primary key,
3 f_id number(10),
4 c_name varchar2(20),
5 constraint ch_fa_1 foreign key (f_id) references father(f_id)
6 on delete cascade
7 );

–插入数据

SQL> insert into father_1 values (1,’cupid’);

已创建 1 行。

SQL> insert into father_1 values (2,’dorria’);

已创建 1 行。

SQL> insert into child_1 values (1,1,’jack’);

已创建 1 行。

SQL> insert into child_1 values (2,2,’rose’);

已创建 1 行。

commit;

提交完成。

SQL> delete from father where f_id=1;

已删除 1 行。

SQL> commit;

提交完成。

SQL> select * from father;

  F_ID F_NAME

    2 dorria

SQL> select * from child_1;

  C_ID      F_ID C_NAME

    2          2 rose

第三种情况:

–创建主表

SQL> create table father_2(

2 f_id number(10) primary key,

3 f_name varchar2(20)

4 );

表已创建。

–创建从表

SQL> create table child_2(
2 c_id number(10) primary key,
3 f_id number(10),
4 c_name varchar2(20),
5 constraint ch_fa_2 foreign key (f_id) references father(f_id)
6 );

–插入数据

SQL> insert into father_2 values (1,’cupid’);

已创建 1 行。

SQL> insert into father_2 values (2,’dorria’);

已创建 1 行。

SQL> insert into child_2 values (1,1,’jack’);

已创建 1 行。

SQL> insert into child_2 values (2,2,’rose’);

已创建 1 行。

commit;

提交完成。

SQL> delete from father_2 where f_id=1;
delete from father_2 where f_id=1
*
第 1 行出现错误:
ORA-02292: 违反完整约束条件 (SCOTT.CH_FA_2) - 已找到子记录

——————————————————————————————————————————————————————————————————————
–建立数据库
create database test;
go

–建立表customers
create table customers(
id int identity(1,1) not null,
name varchar(15),
age int,
primary key(id)
);
go

–建立表orders
create table orders(
id int identity(1,1) not null,
order_number varchar(15),
price money,
customer_id int,
primary key(id)
);
go

–对表orders插入数据,以检测money数据类型,结果为:69.0000
insert into orders(price) values(69);
select * from orders;

–增加外键与关系约束
alter table orders add constraint FK_CUSTOMER foreign key (customer_id) references customers(id);
go

–级联删除、更新
alter table orders add constraint FK_CUSTOMER foreign key (customer_id) references customers(id)
on delete cascade on update cascade;
go

–级联删除
alter table orders add constraint FK_CUSTOMER foreign key (customer_id) references customers(id)
on delete cascade;

go


insert into customers values(‘张三’,25);
insert into customers values(‘李四’,25);

–如果设置了级联插入,那么在向子表orders插入的customer_id(外键)
–必须在父表customers中存在此id(主键)
insert into orders values(1,50,5);

–如果设置了级联删除,删除父表customers中id=5的记录,
–也会删除子表orders中customer_id=5的记录,
delete from customers where id=5

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值