第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文件。