天天看點

Oracle的主鍵和外鍵

一、表的主鍵

在現實世界中,很多資料具有唯一的特性,例如身份證号碼,在國家人口基本資訊表中,一定不會存在多個人用同一個身份證号碼的情況,再例如手機号碼、QQ号碼、銀行帳号等等,還有學生管理系統,學生的年級、班級和學号三個字段組合起來是唯一的辨別。

如果表中一個字段或多個字段組合起來的值是唯一的,就可以作為表的主鍵,在建立或修改表時用primay key關鍵字來指定主鍵。一個表隻能有一個主鍵,而且組成主鍵的每個字段值都不能為空。

主鍵的作用:

1)展現資料結構設計的合理性。

2)提升資料操作的速度。

3)保證資料的完整性,在表中添加或修改記錄時,資料庫會檢查該記錄主鍵的值,不允許與其它記錄主鍵的值重複,這種做法有個專業的名詞:主鍵限制。

例如超女基本資訊表,編号的字段名是id,在超女選秀活動中,每個超女的編号肯定是唯一的,不可能存在兩個編号相同的超女,否則會引起混亂,我們可以把id字段設定為T_GIRL表的主鍵,後面的工作交給資料庫,如果試圖往表中插入多條id相同的記錄,資料庫将拒絕。

指定表的主建有兩種方法。

1)在create table時指定。

create table T_GIRL(
  id        char(4)         not null,   -- 編号
  name      varchar2(30)    not null,   -- 姓名
  yz        varchar2(20)        null,   -- 顔值
  sc        varchar2(20)        null,   -- 身材
  weight    number(4,1)     not null,   -- 體重
  height    number(3)       not null,   -- 身高
  birthday  date            not null,   -- 出生時間
  memo      varchar2(1000)      null,   -- 備注
  primary key(id)                       -- 指定id為表的主鍵
);
      

2)修改已經建好的表,增加主鍵限制。

alter table 表名 add constraint 主鍵名 primary key(字段名1,字段名2,......字段名n);
      

例如:

alter table T_GIRL add constraint PK_GIRL primary key(id);
      

在Oracle資料庫中,雖然主鍵不是必需的,但是最好為每個表都設定一個主鍵,不管是單字段主鍵還是多字段主鍵(複合主鍵),它的存在代表了表結構的完整性,主鍵還可以用于其他表的外鍵關聯,外鍵的知識下面再介紹。

二、表的外鍵

1、外鍵的概念

外鍵(foreign key)是用于表達兩個表資料之間的關系,将表中主鍵字段添加到另一個表中,再建立兩個表之間的限制關系,這些字段就成為第二個表的外鍵。

超女選秀活動有兩個資料表:

1)賽區參數表

賽區代碼,賽區名稱,……。

2)超女基本資訊表

賽區代碼、超女編号、姓名、顔值、身材、身高、體重、……。

錄入超女基本資訊的時候要選擇賽區,為了保證資料的有效,要求錄入賽區代碼時,必須保證賽區參數表中有這個賽區代碼,否則資料是不一緻的,為了保證資料的完整性,必須在程式中判斷資料的合法性。針對這種情況,在表結構設計中采用外鍵來限制這兩個表的賽區代碼字段。

對賽區參數表來說,賽區代碼是該表的主鍵。

對超女基本資訊表來說,賽區代碼是該表的外鍵。

賽區參數表也稱為主表,超女基本資訊表也稱為從表。

2、外鍵的作用

合理的資料結構設計,表中的資料一定有一緻性限制,使用外鍵,讓資料庫去限制資料的一緻,不給任何人出錯的機會。不用外鍵會怎樣?不用也不會怎麼樣,如果不用外鍵,在程式中要寫代碼進行判斷,手工操作資料時也必須處處小心。

3、外鍵限制

1)當對從表進行操作時,資料庫會:

a)向從表插入新記錄時,如果外鍵值在主表中不存在,阻止插入。

b)修改從表的記錄時,如果外鍵的值在主表中不存在,阻止修改。

2)當對主表進行修改操作時,資料庫會:

a)主表修改主鍵值時,舊值在從表裡存在便阻止修改。

3)當對主表進行删除操作時,資料庫會(三選一):

a)主表删除行時,其主鍵值在從表裡存在便阻止删除。

b)主表删除行時,連帶從表的相關行一起删除。

c)主表删除行時,把從表相關行的外鍵字段置為null。

4、建立外鍵

建立外鍵的文法:

alter table 從表名
   add constraint 外鍵名 foreign key (從表字段清單)
      references 主表名 (主表字段清單)
      [on delete cascade|set null];
      

說明:

5、删除外鍵

alter table 從表名 drop constraint 外鍵名;
      

6、示例腳本

/* 建立賽區參數表。 */create table T_AREACODE(
  areaid   number(2)   not null,    -- 賽區代碼,非空。
  areaname varchar(20) not null,    -- 賽區名稱,非空。
  memo     varchar(300),            -- 備注
  primary key(areaid)               -- 建立主健。
);/* 建立超女基本資訊表。 */create table T_GIRL(
  id        char(4)         not null,   -- 編号
  name      varchar2(30)        null,   -- 姓名
  areaid    number(2)           null,   -- 賽區代碼
  yz        varchar2(20)        null,   -- 顔值
  sc        varchar2(20)        null,   -- 身材
  memo      varchar2(1000)      null,   -- 備注
  primary key(id)                       -- 建立主健。
);/* 以下三種建立外鍵的方式隻能三選一  *//* 為T_GIRL建立外鍵,無on delete選項。 */alter table T_GIRL
   add constraint FK_GIRL_AREACODE foreign key(areaid)
      references T_AREACODE(areaid);/* 為T_GIRL建立外鍵,采用on delete cascade選項。 */alter table T_GIRL
   add constraint FK_GIRL_AREACODE foreign key(areaid)
      references T_AREACODE(areaid)
      on delete cascade;/* 為T_GIRL建立外鍵,采用on delete set null選項。 */alter table T_GIRL
   add constraint FK_GIRL_AREACODE foreign key(areaid)
      references T_AREACODE(areaid)
      on delete set null