禁用外键约束来解决输入数据出错的问题

约束是在数据库中维护数据一致性的重要工具。但有时候约束也会带来一些问题。

问题叙述

创建课程表

create table Course
(Cno char(4) primary key,
Cname char(40),
Cpno char(4),
Ccredit smallint,
foreign key (Cpno) references Course(Cno)
);

当你想要创建这样一个表时


禁用外键约束来解决输入数据出错的问题_第1张图片

然后输入数据

insert into Course values (1,'数据库',5,4);
insert into Course values (2,'数学',NULL,2);
insert into Course values (3,'信息系统',1,4);
insert into Course values (4,'操作系统',6,3);
insert into Course values (5,'数据结构',7,4);
insert into Course values (6,'数据处理',NULL,2);
insert into Course values (7,'PASCAL语言',6,4);

却发现出错了,有外键约束。你不能插入数据
怎么办呢?


问题解决

有两种方法

  • 一是删除外键约束,插入数据之后,再加上外键约束。
    这种方法,很麻烦,我不是很喜欢,也不是最好的方法。
  • 二是禁用外键约束,然后插入数据,再打开外键约束。(这才是本文的重点,唠了半天终于到点上了。。。。)
    我们看代码
/*禁用外键约束*/
alter table 表名 disable constraint 外键约束名;
/*解除禁用*/
alter table 表名 enable constraint 外键约束名;

现在又有问题了上面我们不知道外键约束名啊,我们建表的时候没有给外键约束起名。。。
那怎么办啊,问题总是要解决的不是吗,你没起名,可系统给他起名字啦,所以你要查系统给的名称,怎么查呢,下面代码告诉你。

/*就是用数据字典里的这个表里查user_constraints*/
select * from user_constraints where table_name='COURSE';

查询的结果


在TYPE中P代表主键,R代表外键

好了问题都解决了。


多谢刘老师的点拨与解答,刘老师提出了第三种方案,在这里为大家献上。
第三种方案

你可能感兴趣的:(禁用外键约束来解决输入数据出错的问题)