外鍵約束

概念

  • 一張表的一個字段受限於另一張表的一個字段對應的值。這裏涉及到兩張表:被引用的表叫主表(父表),另一張叫從表(子表)。
  • 它們的關係:主從表關係(父子表關係)
  • 子表:定義了外鍵的表

 外鍵的取值要麼取父表中字段對應的值,要麼取NULL值sql

 嚴重受限於父表windows

  • 父表:被引用的字段要具備惟一性(絕大多數都是用的父表的主鍵)

理論上是能夠一張表裏的一個字段引用另外一個字段,但通常都是用兩張表服務器

外鍵的實現

  • 創建表:

先創建父表,後創建子表(由於子表要用到父表)spa

除非先不考慮外鍵(建完表後再加),表多的時候能夠不考慮建表順序。弊端:對數據要求很嚴格,一個垃圾數據都不能放3d

父表:blog

create table parent(
  id number primary key,
  name varchar2(30),

);

  

子表:cmd

create table child(
  id number primary key,
  name varchar2(30),
  fid number constraint child_fid_fk references parent(id),
);

  • 插入數據:

通常先插入父表數據,再插入子表數據。除非把子表的外鍵值設置成NULL值,不然會出完整性錯誤it

insert into child values(1, 'test1', 1);

 

要改成:先加入父表數據table

insert into parent values(1, 'p1');
insert into parent values(2, 'p2');
insert into child values(1, 'test1', 1);

 

  • 刪除數據

子表中有關聯的數據,須要先刪子表,後刪父表。class

select * from parent;

這裏刪除父表的id爲2的是不要緊的,只要沒有子表和它關聯就行

有關聯的必須先刪子表的數據,再刪父表的數據

   

delete from parent where id=1;

 

  • 刪除表

先刪子表,後刪父表

除非使用casecade  constraints  解除關聯

drop table parent;

 

先刪父表會出錯:

有一個被foreign  keys關聯的unique/primary  key的字段在表中

 

使用casecade  constraints解除關聯就能夠刪掉父表

drop table parent cascade constranints;

外鍵的表級約束實現

父表:

create table parent(
  id number primary key,
  name varchar2(30),
);

 

子表:

create table child(
  id number primary key,
  name varchar2(30),
  fid number,
  constraint child_fid_fk foreign key(fid) references parent(id),
);

 

先創建表,後加外鍵

  • 子表s_emp :

裏面有外鍵dept_id

  • 父表s_dept

查看腳本summit2_drop.sql發現:1270行

ALTER  TABLE s_emp
ADD  CONSTRAINT s_emp_dept_id_fk
FOREIGN  KEY (dept_id)  REFERENCES  s_dept(id);

級聯刪除和級聯置空

  • 級聯刪除:

在外鍵的最後,加上on delete  cascade  就是級聯刪除

再刪除主表數據時和主表關聯的子表數據也會刪除

  • 級聯置空

在在外鍵的最後,加上on  delete  set null就是級聯置空

再刪除主表數據時,會把和主表關聯的外鍵設置成NULL

演示:先刪表,無論有沒有

  (1)創建一張父表部門表

  • id number  primart  key  
  • name varchar2(30)
create table mydept(
  id nimber constraint mydept_pk primary key,
  name varchar2(30),
);

 

(2)創建一張子表  員工表

  • id number  primart  key  
  • name varchar2(30)
  • dept_id number  外鍵(關聯到部門表)
  • salary varchar2(30)

    

create table mtemp(
    id number constraint myepm_id_pk primary key,
  name varchar2(30),
  salary number,
  dept_id number constraint myemp_depy_id_fk reference mydept(id) on delete cascade,
);

  

desc mtemp;

 

(3)分別向兩張表中放入數據

部門表:

insert into mydept values(1, 'test1');
insert into mydept values(2,'test2');

 

select * from mydept;

 

員工表:

insert into mtemp values(1, 'empa', 5000,1);
insert into mtemp values(2, 'empb', 4500,1);
insert into mtemp values(3, 'empc', 5500,1);
insert into mtemp values(4, 'empd', 5800,2);
insert into mtemp values(5, 'empe', 5100,2);

 

select * from mtemp;

              提交數據:commit;

 

 (4)由於有on  delete cascade,因此刪除父表中的id爲1的部分是能夠的,並不會由於有關聯而刪不掉。

delete from mydept where id=1;

 

select * from mydept;

 

select * from mtemp;

 

(5)若是換爲on  delete set  null,因此刪除父表中的id爲1的部分是能夠的,而子表的關聯的相應部分置爲空  

delete from mydept where id=1;

  

select * from mydept;

 

select * from mtemp;

注意:若是是windows寫在.sql腳本里,則全部以上的代碼包括commit都寫入,再在cmd切到存放腳本的磁盤(如D)。

ftp傳到服務器上(192.168.0.26)

  • 這裏清屏用!cls
  • put  要傳送的文件名把文件傳送到服務器
  • @要執行的文件名執行文件
  • 在SQL>@/user/openlab/要執行的腳本文件
相關文章
相關標籤/搜索