1. 程式人生 > 實用技巧 >第22課 高階SQL特性

第22課 高階SQL特性

第22課 高階SQL特性

22.1 約束

22.1.1 主鍵

主鍵是一種特殊的約束,用來保證一列(或一組列)中的值是唯一的,而且永不改動。換句話說,表中的一列(或多個列)的值唯一標識表中的每一行。

一種定義主鍵的方法是建立它,如下所示:

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

這裡定義相同的列為主鍵,但使用的是CONSTRAINT語法。

22.1.2 外來鍵

外來鍵是表中的一列,其值必須列在另一表的主鍵中。

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

CREATE TABLE Orders
(
    order_num     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不允許刪除在另一個表中具有關聯行的行。由於需要一系列的刪除,因而利用外來鍵可以防止意外刪除資料。

22.1.3 唯一約束

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

  • 表可包含多個唯一約束,但每個表只允許一個主鍵。
  • 唯一約束列可包含NULL值。
  • 唯一約束列可修改或更新。
  • 唯一約束列的值可重複使用。
  • 與主鍵不一樣,唯一約束不能用來定義外來鍵。

22.1.4 檢查約束

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

  • 檢查最小或最大值。例如,防止0個物品的訂單(即使0是合法的數)。
  • 指定範圍。例如,保證發貨日期大於等於今天的日期,但不超過今天起一年後的日期。
  • 只允許特定的值。例如,在性別欄位中只允許M或F。
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]')

22.2 索引

索引用來排序資料以加快搜索和排序操作的速度。

索引用CREATE INDEX語句建立(不同DBMS建立索引的語句變化很大)。

CREATE INDEX prod_name_ind
ON PRODUCTS (prod_name);

索引必須唯一命名。這裡的索引名prod_name_ind在關鍵字CREATE INDEX之後定義。ON用來指定被索引的表,而索引中包含的列(此例中僅有一列)在表名後的圓括號中給出。

22.3 觸發器

觸發器是特殊的儲存過程,它在特定的資料庫活動發生時自動執行。觸發器可以與特定表上的INSERT、UPDATE和DELETE操作(或組合)相關聯。

與儲存過程不一樣(儲存過程只是簡單的儲存SQL語句),觸發器與單個的表相關聯。

22.4 資料庫安全

任何安全系統的基礎都是使用者授權和身份確認。

一般說來,需要保護的操作有:

  • 對資料庫管理功能(建立表、更改或刪除已存在的表等)的訪問;
  • 對特定資料庫或表的訪問;
  • 訪問的型別(只讀、對特定列的訪問等);
  • 僅通過檢視或儲存過程對錶進行訪問;
  • 建立多層次的安全措施,從而允許多種基於登入的訪問和控制;
  • 限制管理使用者賬號的能力。

22.5 小結

不同的DBMS可能會以不同的形式提供這些特性,更詳細的資訊請參閱具體的DBMS文件。