SQL必知必會 約束

2021-10-09 10:44:49 字數 3254 閱讀 9893

關聯表和引用完整性已經在前面討論過幾次。正如所述,關聯式資料庫儲存分解為多個表的資料,每個表儲存相應的資料。利用鍵來建立從乙個表到另乙個表的引用(由此產生了術語 引用完整性( referential integrity ))。

管理如何插入或處理資料庫資料的規則。

主鍵是一種特殊的約束,用來保證一列(或一組列)中的值是唯一的,而且永不改動。換句話說,表中的一列(或多個列)的值唯一標識表中的每一行。這方便了直接或互動地處理表中的行。沒有主鍵,要安全地update或delete特定行而不影響其他行會非常困難。

表中任意列只要滿足以下條件,都可以用於主鍵:

1.任意兩行的主鍵值都不相同。

2.每行都具有乙個主鍵值(即列中不允許null值)。

3.包含主鍵值的列從不修改或更新。(大多數 dbms 不允許這麼做,但如果你使用的 dbms 允許這樣做,好吧,千萬別!)

4.主鍵值不能重用。如果從表中刪除某一行,其主鍵值不分配給新行。

一種定義主鍵的方法是建立它

create table vendors

(vend_id char(10) not null primary key,

vend_name char(50) not null,

vend_address char(50) null,

vend_city char(50) null,

vend_state char(5) null,

vend_zip char(10) null,

vend_country char(50) null

);

在此例子中,給表的vend_id列定義新增關鍵字primary key,使其成為主鍵。

alter table vendors

add constraint primary key (vend_id);

外來鍵是表中的一列,其值必須列在另一表的主鍵中。外來鍵是保證引用完整性的極其重要部分。我們舉個例子來理解外來鍵。

orders表將錄入到系統的每個訂單作為一行包含其中。顧客資訊儲存在customers表中。orders表中的訂單通過顧客 id 與customers表中的特定行相關聯。顧客 id 為customers表的主鍵,每個顧客都有唯一的 id 。訂單號為orders表的主鍵,每個訂單都有唯一的訂單號。

orders表中顧客 id 列的值不一定是唯一的。如果某個顧客有多個訂單,則有多個行具有相同的顧客 id (雖然每個訂單都有不同的訂單號)。同時,orders表中顧客 id 列的合法值為customers表中顧客的 id 。

這就是外來鍵的作用。在這個例子中,在orders的顧客 id 列上定義了乙個外來鍵,因此該列只能接受customers表的主鍵值。

下面是定義這個外來鍵的方法:

create table orders

( order_nun integer not null,primary key,

order_date datetime not null,

cust_id char(10) not null,references customers(cust_id)

);

其中的表定義使用了references關鍵字,它表示cust_id中的任何值都必須是customers表的cust_id中的值。

相同的工作也可以在alter table語句中用constraint語法來完成:

alter table orders

add constraint

foreign key(cust_id) references customers(cust_id);

有的 dbms 支援稱為級聯刪除( cascading delete )的特性。如果啟用,該特性在從乙個表中刪除行時刪除所有相關的資料。例如,如果啟用級聯刪除並且從customers表中刪除某個顧客,則任何關聯的訂單行也會被自動刪除。

唯一約束用來保證一列(或一組列)中的資料是唯一的。它們類似於主鍵,但存在以下重要區別。

1.錶可包含多個唯一約束,但每個表只允許乙個主鍵。

2.唯一約束列可包含null值。

3.唯一約束列可修改或更新。

4.唯一約束列的值可重複使用。

5.與主鍵不一樣,唯一約束不能用來定義外來鍵。

唯一約束的語法類似於其他約束的語法。唯一約束既可以用unique關鍵字在表定義中定義,也可以用單獨的constraint定義。

檢查約束用來保證一列(或一組列)中的資料滿足一組指定的條件。檢查約束的常見用途有以下幾點。

1.檢查最小或最大值。例如,防止 0 個物品的訂單(即使 0 是合法的數)。

2.指定範圍。例如,保證發貨日期大於等於今天的日期,但不超過今天起一年後的日期。

3.只允許特定的值。例如,在性別欄位中只允許m或f。

資料型別限制了列中可儲存的資料的型別。檢查約束在資料型別內又做了進一步的限制,這些限制極其重要,可以確保插入資料庫的資料正是你想要的資料。不需要依賴於客戶端應用程式或使用者來保證正確獲取它, dbms 本身將會拒絕任何無效的資料。

下面的例子對orderitems表施加了檢查約束,它保證所有物品的數量大於 0 :

輸入 ▼

create table orderitems

(order_num integer not null,

order_item integer not null,

prod_id char(10) not null,

quantity integer not null check (quantity > 0),

item_price money not null

);

利用這個約束,任何插入(或更新)的行都會被檢查,保證quantity大於 0 。

檢查名為gender的列只包含m或f,可編寫如下的alter table語句:

add constraint check (gender like 『[mf]』)

在 sql 中,我們有如下約束:

1.not null - 指示某列不能儲存 null 值。

2.unique - 保證某列的每行必須有唯一的值。

3.primary key - not null 和 unique 的結合。確保某列(或兩個列多個列的結合)有唯一標識,有助於更容易更快速地找到表中的乙個特定的記錄。

4.foreign key - 保證乙個表中的資料匹配另乙個表中的值的參照完整性。

5.check - 保證列中的值符合指定的條件。

6.default - 規定沒有給列賦值時的預設值。

SQL必知必會

資料庫 儲存有組織的資料的容器。資料庫管理系統 dbms 資料庫軟體,資料庫是通過dbms建立和操縱的容器。表 某種特定資料型別的結構化清單。資料庫中的每個表都有自己的名字,且唯一。不同的資料庫可以使用相同的表名。表的特性 模式 資料在表中如何儲存,儲存什麼樣的資料,資料如何分解。模式可以用來描述資...

《sql必知必會》筆記

資料庫 儲存有組織的資料的容器 通常是乙個檔案或一組檔案 注意誤用混淆 資料庫軟體被稱為dbms,資料庫是通過dbms建立和操縱的容器 模式 關於資料庫和表的布局及特性的資訊。主鍵 一列或一組列,其值能夠唯一標識表中的每一行。多條sql語句必須以 分隔。sql語句不區分大小寫,select和sele...

SQL必知必會2

資料庫伺服器有 兩種儲存介質 分別為硬碟和 記憶體。記憶體屬於臨時儲存,容量有限,且當發生意外時 如斷電或者發生故障重啟 會造成資料丟失 硬碟相當於永久儲存介質,這也是為什麼我們需要把資料儲存到硬碟上。資料庫中管理儲存空間的基本單位是頁 page 不論是讀一行還是多行,都是講這些行所在的頁進行載入 ...