關聯表和引用完整性已經在前面討論過幾次。正如所述,關聯式資料庫儲存分解為多個表的資料,每個表儲存相應的資料。利用鍵來建立從乙個表到另乙個表的引用(由此產生了術語 引用完整性( 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 不論是讀一行還是多行,都是講這些行所在的頁進行載入 ...