約束是在數(shù)據(jù)庫中維護數(shù)據(jù)一致性的重要工具伺通。但有時候約束也會帶來一些問題狂秦。
問題敘述
創(chuàng)建課程表
create table Course
(Cno char(4) primary key,
Cname char(40),
Cpno char(4),
Ccredit smallint,
foreign key (Cpno) references Course(Cno)
);
當你想要創(chuàng)建這樣一個表時
然后輸入數(shù)據(jù)
insert into Course values (1,'數(shù)據(jù)庫',5,4);
insert into Course values (2,'數(shù)學(xué)',NULL,2);
insert into Course values (3,'信息系統(tǒng)',1,4);
insert into Course values (4,'操作系統(tǒng)',6,3);
insert into Course values (5,'數(shù)據(jù)結(jié)構(gòu)',7,4);
insert into Course values (6,'數(shù)據(jù)處理',NULL,2);
insert into Course values (7,'PASCAL語言',6,4);
卻發(fā)現(xiàn)出錯了关带,有外鍵約束细溅。你不能插入數(shù)據(jù)褥傍。
怎么辦呢?
問題解決
有兩種方法
- 一是刪除外鍵約束喇聊,插入數(shù)據(jù)之后恍风,再加上外鍵約束。
這種方法,很麻煩朋贬,我不是很喜歡鸥咖,也不是最好的方法。 - 二是禁用外鍵約束兄世,然后插入數(shù)據(jù),再打開外鍵約束啊研。(這才是本文的重點御滩,嘮了半天終于到點上了。党远。削解。。)
我們看代碼
/*禁用外鍵約束*/
alter table 表名 disable constraint 外鍵約束名;
/*解除禁用*/
alter table 表名 enable constraint 外鍵約束名;
現(xiàn)在又有問題了上面我們不知道外鍵約束名啊沟娱,我們建表的時候沒有給外鍵約束起名氛驮。。济似。
那怎么辦啊矫废,問題總是要解決的不是嗎,你沒起名砰蠢,可系統(tǒng)給他起名字啦蓖扑,所以你要查系統(tǒng)給的名稱,怎么查呢台舱,下面代碼告訴你律杠。
/*就是用數(shù)據(jù)字典里的這個表里查user_constraints*/
select * from user_constraints where table_name='COURSE';
查詢的結(jié)果
在TYPE中P代表主鍵,R代表外鍵
好了問題都解決了竞惋。
多謝劉老師的點撥與解答柜去,劉老師提出了第三種方案,在這里為大家獻上拆宛。
第三種方案