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

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

问题叙述

创建课程表

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

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



然后输入数据

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代表外键

好了问题都解决了。


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容