外鍵所指定的字段(列)取值受限制,可以取兩種值:
-
所參照主鍵中出現過的值;
-
可以取空值。
第一種情況 restrict關鍵字
例子:創建了2張表
create table class(cno int primary key, cname varchar(20) ) create table student(sno int primary key, sname varchar(10), cno int, foreign key(cno) references class(cno) on delete restrict)
表class中,con列是主鍵,表student中,sno是主鍵,cno外鍵,外鍵取值如上面說過的右2種
情況1.要在主鍵中出現過2.該外鍵取值位null,上述表student外鍵加了restrict關鍵字所以當從表class(主鍵)刪除一條數據,剛好表student中有該班級的學生,則會報錯,不允許刪除
第二種情況 cascade關鍵字
create table student(sno int primary key, sname varchar(10), cno int, foreign key(cno) references class(cno) on delete cascade)
cascade表示聯級刪除,當刪除主表(主鍵)即class表的中一條數據,會把表student(依賴表)
里對應的數據一起刪掉
第三種情況 set null關鍵字
在外鍵定義時還可以指定on delete set null,表示刪除class表中的一條數據時,如果student表中有對應的數據,則把這些對應的數據的cno設置為空值NULL。
--有關set null的測試 --1.創建2張表 create table class( cno number(5) primary key, cname varchar2(20) ); create table student( sno number(5) primary key, sname varchar2(10), cno number(5), foreign key(cno) references class(cno) on delete set null ); --第一張和第二張表插入數據 insert into class ele01 values(1,'高一一班'); insert into class ele01 values(2,'高二二班'); insert into class ele01 values(3,'高三三班'); commit; insert into student values(1,'大黃01',01); insert into student values(2,'大黃02',02); insert into student values(3,'大黃03',03); commit; --刪除數據 delete from class ele01 where ele01.cno= 2; commit; --查看結果 select * from student;