資料庫設計的外來鍵約束問題

2021-04-16 14:04:08 字數 1657 閱讀 7634

我們在做資料庫設計的時候,往往為了保證資料庫的資料完整性,會有一些在資料庫層面上定義的約束。這些約束有檢查約束、非空約束、唯一約束、主鍵約束、外來鍵約束等。在這些約束裡面,前面的幾個都非常容易理解,也易於使用;但是對於外來鍵約束,理解起來並不難,但是使用好了,確是不容易。

下面簡要回顧一下上述幾個約束的相關知識。

檢查約束:

也就是說在定義欄位的時候,定義乙個取值範圍,當發生insert或者update的時候,資料庫自動檢查數值是否在合時的範圍之內。例如:

crate table student(

id serial,

name varchar(10),

scrore integer check (scrore > 0)

非空約束

非空約束就是定義乙個字段不能存在空值,常用not null定義。如果僅僅是非空約束,那麼是資料是允許重複的。

唯一約束

唯一約束,使用unique修飾。表示該字段內的資料,是相對唯一的,即在本表內是唯一的。唯一約束的資料,可以存在null值。

主鍵約束

主鍵約束其實就是非空約束和主鍵約束的並集。主鍵的取值方法可以有多種,可以有自然數遞增序列,也可以使用唯一編碼演算法產生的字串序列。

外來鍵約束

外來鍵約束是很常用的乙個資料約束方式。但是使用起來並不是那麼簡單。定義外來鍵約束的方法,使用foreign key,可以用於單列或者多列。foreign key和refernces經常聯合使用。references表示該列引用哪個表的哪個列作為外來鍵。單列時,foreign key可以省略。

例如:job_id   **allint      not null      default 1      references jobs(job_id)

上述定義也可以寫為:

job_id   **allint      not null      default 1      foreign key (job_id) references jobs(job_id)

說明外來鍵job_id引用了jobs表的job_id欄位作為外來鍵。

外來鍵約束帶來的乙個問題是,當使用者試圖刪除或者更新外來鍵所指向的鍵時,另外乙個表中的資料,該如何處理的問題。這涉及到乙個級聯更新和級聯刪除的問題。

那麼在資料庫規範中,同樣定義了級聯更新和級聯刪除的相關方法。

create table和alter table的references子句支援on delete 和on update字句。如果沒有指定,預設為no action,即:on delete no action,和on update no action,在發生刪除或者更新操作的時候,回滾事務,不執行相關操作。

cascade子句則允許操作,方法為:on delete casecade 和on update cascade 。

如果定義的時候要求能更新不能刪除,則寫為:

create table score(

id integer

references student

on update cascade

on delete cascade,

class_id varchar(5)

references class

on update cascade

cascade和no action的結合使用,才能讓外來鍵約束充分發揮作用,不導致系統資料約束造成的混亂。 

資料庫設計外來鍵

今天心情很煩躁,公司來了新員工,我感覺到自己這個渣渣要晚年不保啊,隨後就隨便網上逛逛,看到這個挺有意思。設計外來鍵竟然還有人不會?哈哈哈,這不是說我呢嘛!外來鍵一般用於一對多的時候,比如說某個型別type下面可能有多個物件。訂單的話,乙個訂單號肯定會有關於這個訂單 號碼 的訂單詳情,這是給客戶看的,...

MySQL資料庫(五)外來鍵約束

一 foreign key 的作用和要求 找到my.ini檔案,開啟,找到defult stroage engine innodb,檢視引擎是否是innodb,如下圖 案例 一 建立父類表和子類表,資料型別不一致導致150錯誤 mysql create table sheng id smallint...

資料庫(外來鍵及其約束理解)

一 首先是外來鍵的定義 如果乙個欄位x在一張表 表一 中是主關鍵字,而在另外一張表 表二 中不是主關鍵字,則字段x稱為表二的外來鍵 換句話說如果關係模式r1中的某屬性集不是自己的主鍵,而是關係模式r2的主鍵,則該屬性集稱為是關係模式r1的外來鍵。二 主鍵表和外鍵表的理解 1 以公共關鍵字作主鍵的表為...