按書上P82的圖3.2 學生-課程資料庫的資料示例(b)的Course表的內容,插入課程號為1的資料時提示違反了外來鍵約束。
插入語句:insert into course(cno,cname,cpno,ccredit)
values("1","資料庫","5",4);分析:
先根據Course表的定義,看哪一個是外來鍵。
表定義的SQL語句在P85的例6。
create table course (cno
char(4) primary key,
cname char(40),
cpno char(4),
ccredit smallint,
foreign key cpno references course(cno));
從上面的SQL語句可以看出,cpno是外來鍵,而且引用的是該表的主鍵cno。
根據書上P51的規則2.2,參照完整性規則,外來鍵cpno的取值不為空的情況下(如上cpno="5"),與其對應的主鍵cno必須存在。因為,第一個插入的就是cno="1"的資料,cno="5"的還沒有插入,很顯然不滿足參照完整性規則。
解決方法:
第一種解決方法是插入資料的時候,所有的cpno暫時都置為null,所有資料插入以後,再依次更新這些資料的cpno的值。該方法的優點是複雜性低,容易實現。
第二種解決方法是插入資料的時候,不是按表中cno的順序插入。而是根據資料依賴的關係插入資料。比如,根據表裡的資料,分析得出可以按cno=2、6、4、7、5、1、3的順序插入資料。
按書上P82的圖3.2 學生-課程資料庫的資料示例(b)的Course表的內容,插入課程號為1的資料時提示違反了外來鍵約束。
插入語句:insert into course(cno,cname,cpno,ccredit)
values("1","資料庫","5",4);分析:
先根據Course表的定義,看哪一個是外來鍵。
表定義的SQL語句在P85的例6。
create table course (cno
char(4) primary key,
cname char(40),
cpno char(4),
ccredit smallint,
foreign key cpno references course(cno));
從上面的SQL語句可以看出,cpno是外來鍵,而且引用的是該表的主鍵cno。
根據書上P51的規則2.2,參照完整性規則,外來鍵cpno的取值不為空的情況下(如上cpno="5"),與其對應的主鍵cno必須存在。因為,第一個插入的就是cno="1"的資料,cno="5"的還沒有插入,很顯然不滿足參照完整性規則。
解決方法:
第一種解決方法是插入資料的時候,所有的cpno暫時都置為null,所有資料插入以後,再依次更新這些資料的cpno的值。該方法的優點是複雜性低,容易實現。
第二種解決方法是插入資料的時候,不是按表中cno的順序插入。而是根據資料依賴的關係插入資料。比如,根據表裡的資料,分析得出可以按cno=2、6、4、7、5、1、3的順序插入資料。