1. 程式人生 > >7、外來鍵約束

7、外來鍵約束

學習目標:

1、掌握外來鍵約束的意義

2、掌握建立外來鍵約束的語法

學習過程:

一、外來鍵約束

Foreign key 約束用於定義主從表之間的關係,外部鍵約束要定義在從表上, 但主表必須具有主鍵約束或唯一約束. 當定義了外部鍵約束之後,要求外部鍵列的資料必須在主表的主鍵列(或唯一鍵)中存在, 或者為Null。

在資料庫中表與表之間不是獨立的,它們是有關係的。這在我們顯示生活中的例子也有很多,學生表和班級表之間的關係是,每一個學生必然屬於一個班級,也就是說必須先有班級,然後才能新增學生。還比如部門表和職位表,每一個職位也必然屬於某個部門等等。

下面我們建立一個部門表和一個職位表,因為職位表的資料必須參考部門表,所以我們把職位表稱為從表,部門表稱為主表。示例:

1、定義部門表和職位表

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

 --部門表

create table department 

(

   dep_id int primary key,

   dep_name varchar2(100) not null

)

 

--職位表

create table post

(

   

post_id int primary key,

   post_name varchar2(100),

   --所屬部門

   dep_id int ,

   

)

2、定義外來鍵約束,FOREIGN KEY:定義在表約束級的子表的列,REFERENCES:鑑別在父表中的表和列  

1

2

3

 alter table post drop constraint  FK_dep_id 

--外來鍵約束  -- constraint 約束名  foreign key(外來鍵) references 主表(主鍵)

alter table post add constraint  FK_dep_id  foreign key(dep_id) references department(dep_id)

3、先為部門表新增三條資料

1

2

3

  insert into department(dep_id,dep_name) values(1,'IT部門');

insert into department(dep_id,dep_name) values(2,'行政部門');

insert into department(dep_id,dep_name) values(3,'掃地部門');

4、嘗試為職位表新增資料,這時候職位表的外來鍵值必須是部門表已經存在的。

1

2

3

4

5

6

7

 --新增成功

insert into post(post_id,post_name,dep_id) values(1,'DBA',1)   

insert into post(post_id,post_name,dep_id) values(2,'java程式設計師',3);

insert into post(post_id,post_name,dep_id) values(3,'專案經理',3);

 

--新增失敗

insert into post(post_id,post_name,dep_id) values(3,'專案組長',4);

二、CASCADE級聯特性

CASCADE是級聯操作,一般只主表發生變化是,從表應該做如何變化。

ON DELETE CASCADE:當父表中的行被刪除的時候,同時刪除在子表中依靠的行。

nON DELETE SET NULL:將依靠的外來鍵值轉換為空值

示例:

1

2

3

4

5

--先刪除原來的約束

alter table post drop constraint  FK_dep_id 

--重新定義外來鍵約束

alter table post add constraint  FK_dep_id  foreign key(dep_id) references department(dep_id) 

   on delete set null

嘗試把主表的主鍵為3的語句刪除,這時候從表的外來鍵為3的值就會修改為null值。