1.
約束為正確地進行關聯式資料庫設計,需要一種方法來保證只在表中插入合法的資料。例如,如果
orders
表儲存訂單資訊,
orderitems
表儲存訂單詳細內容,應該保證
orderitems
中引用的任何訂單
id存在於
orders
中。類似地,在
orders
表中引用的任意使用者必須存在於
customers
表中。最好不要在插入新行時進行檢查,原因如下:
約束(constraint
):管理如何插入或處理資料庫資料的規則。
dbms
通過在資料庫表上施加約束來實施引用完整性。大多數約束是在表定義中定義的。
(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
語法將vend_id
列設為主鍵。
(2)外來鍵
外來鍵是表中的乙個列,其值必須在另乙個表的主鍵中列出。外來鍵是保證引用完整性的乙個極重要的成分。
例如:orders
表對每個錄入到系統的訂單包含一行。
顧客資訊儲存在
customers
表中。
orders
表中的訂單通過客戶id與
customers
表中特定行相關聯。
客戶id為
customers
表的主鍵;每個客戶都有唯一的
id。
訂單號為
orders
表的主鍵;每個訂單都有唯一的訂單號。
orders
表中顧客
id列的值不一定是唯一的,若某個顧客有多個定
damn
,則有多個行具有相同的顧客
id。
同時,
orders
表中顧客
id列的合法值為
customers
表中顧客的
id。
上例中,在
orders
的顧客id
列上定義了乙個外來鍵,因此該列只能接受
customers
表的主鍵值。
定義外來鍵的的一種方法,輸入:
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)
); 也可以在
alter table
語句中使用
constraint
語法來完成,輸入:
alter table customers
add constraint
foreign key (cust_id) references customers (cust_id);
外來鍵有助防止意外刪除:
幫助保證引用完整性外;
‚在定義外來鍵後,
dbms
不允許刪除在另乙個表中具有關聯行的行。
(3)唯一約束
唯一約束用來保證乙個列中的資料唯一。
類似於主鍵,但存在幾個重要區別:
唯一約束的語法類似於其他約束的語法。唯一約束既可以用
unique
關鍵字在表定義中定義,也可以用單獨的
constraint
定義。(4)
檢查約束
檢查約束用來保證乙個列中的資料滿足一組指定的條件。
常見用途:
檢查最小或最大值。
‚指定範圍。
ƒ只允許特定的值。
下面對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
); 檢查名為
gender
的列只包含m或
f,使用
altet table
語句,輸入:
add constraint check (gender like '[mf]');
2.索引
索引用來排序資料以加快搜尋和排序操作的速度。
可以在乙個或多個列上定義索引,使
dbms
儲存其內容的乙個排過序的列表。定義索引後,
dbms
搜尋排過序的索引,找出匹配的位置,然後檢索這些行。
在開始建立索引前,應該記住以上內容:
(1)索引改善檢索操作的效能,但降低資料插入、修改和刪除的效能。在執行這些操作時,
dbms
必須動態地更新索引。
(2)索引資料可能要占用大量的儲存空間。
(3)並非所有資料都適合於索引。
(4)索引用於資料過濾和資料排序。
(5)可以在索引中定義多個列。
索引用create index
語句建立。
下面在products
表的產品名列上建立乙個簡單索引,輸入:
create index prod_name_ind
on products(prod_name);
索引必須唯一命名。這裡的索引名在關鍵字
create index
之後定義。
on用來指定被索引的表,而索引中包含的列在表名後的圓括號中給出。
檢查索引:索引的效率隨錶資料的增加或改變而變化。
3.觸發器
觸發器是特殊的儲存過程,它在特定的資料庫活動發生時自動執行。觸發器可以與特定表上的
insert
、update
和delete
操作相關聯。
與儲存過程不一樣,觸發器與單個的表相關聯。與
orders
表上的insert
操作相關聯的觸發器只在
orders
表中插入行時執行。類似地,
customers
表上的insert
和update
操作的觸發器只在表上出現這些操作時執行。
觸發器內的**具有以下資料的訪問權:
觸發器的一些常見用途:
建立乙個觸發器,它對所有
insert
和update
操作,轉換
customers
表中的cust_state
列為大寫。
sql server
版本,輸入:
create trigger customer_state
on customers
for insert, update
as update customers
set cust_state = upper(cust_state)
where customers.cust_id = inserted.cust_id;
一般來說,約束的處理比觸發器快,因此在可能的時候,應該盡量使用約束。
4.資料庫安全
大多數的
dbms
都給管理員提供了管理機制,可利用管理機制授予或限制對資料的訪問。
任何安全系統的基礎都是使用者授權和身份確認。這是一種處理,通過這種處理對使用者進行確認,以保證其為有權使用者,允許執行其試圖執行的操作。有的
dbms
為此目的結合使用了作業系統的安全措施,而有的維護自己的使用者及密碼列表,還有一些結合使用外部目錄服務伺服器。
需要保護的操作:
安全性通過
sql的
grant
和revoke
語句來管理,不過,大多數
dbms
提供了互動式的管理使用程式,這些使用程式在內部使用
grant
和revoke
語句。
SQL必知必會 22 高階SQL特性
主鍵是一種特殊的約束,用來保證一列 或一列組 中的值是唯一的,而且永不改動。表中任意列只要滿足以下條件,都可以用於主鍵 外來鍵是表中的一列,其值必須列在另一表的主鍵中。唯一約束用來保證一列 或一組列 中的資料是唯一的,他們類似於主鍵,存在以下重要區別 檢查約束用來保證一列 或一列組 中的資料滿足一組...
SQL高階特性
1 約束 constraint 約束是表示管理如何插入或處理資料庫資料的規則。dbms通過在資料庫上施加約束來實施引用完整性。有的約束是在建立表的時候定義的,有的約束可以在建立表之後再定義。下面列舉一些常見的約束 在建立表的時候定義主鍵 create table table name 在表建立後定義...
SQL基礎 理解高階SQL特性
在本節課中,介紹幾種sql中的高階資料操作特性 約束 索引和觸發器 關聯式資料庫將資料儲存為多個表,每個表儲存相關資料。鍵用於建立從乙個表到另乙個表的引用 因此稱為引用完整性 要使關聯式資料庫設計正常工作,需要確保只有有效的資料被插入到表中。儘管可以在插入新行之前執行檢查 在另乙個表上執行selec...