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];

說明:

外鍵名,Oracle的標識符,建議采用FK_從表名_主表名的方式命名。

主表執行刪除行時,其主鍵值在從表里存在便阻止刪除,如果on delete cascade,連帶從表的相關行一起刪除;如果on delete set null,把從表相關行的外鍵字段置為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;

三、版權聲明

C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道

如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM