約束與索引

2021-07-15 05:20:12 字數 3163 閱讀 8071

一、約束

首先介紹一下常見的六種約束的用法

1.非空約束 not null

create table emp

(emp_id nvarchar(9) not null,

emp_name nvarchar(50) not null,

當一列被建立時,可以使用not null約束,空值null 等於沒有或未知道,該錶的兩個列不允許插入null或者不設定值。

2.主鍵約束 primary key

用於標識表中一行資料是唯一的,主鍵通常由一列組成,但也可以多列共同組成主鍵。主鍵是乙個隱性約束

create table emp

(emp_id nvarchar(9) not null primary key,

emp_name nvarchar(50) not null,

alter table emp add constraint emp_name_pk primary key(emp_name)

改變乙個表的約束

3.唯一約束 unique

是指約束在指定列上的值必須唯一,它和主鍵約束類似,當在乙個表上的一列放置主鍵約束時,可以在另一列上放置唯一約束。主鍵比約束唯一多了資料提供順序和在查詢中用於連線表之外,主鍵約束和唯一約束沒有太大區別。

create table emp

(emp_id nvarchar(9) not null primary key ,

emp_name nvarchar(50) not null unique,)

4.外來鍵約束 foreign key (父子表)

create table emp_pay

(emp_id nvarchar(9) not null,

posititon varchar(15) not null,

pay_rate nvarchar(50) not null,

goalter table emp_pay add constraint emp_id_fk foreign key(emp_id) references emp(emp_id);

go5.校驗約束

用來檢查輸入到表中某一特定列的資料的有效性,一般應用程式在前台也要校驗資料是否有效,資料庫的校驗提供了另一種實現資料的保護方式。

add constraint ck_stuage check(stuage between 15 and 40)

add constraint chk_emp_zip check ( emp_zip = 『050021』)

add constraint chk_emp_zip check ( emp_zip in ( 『050021』,』050000』,021111』))

add constraint chk_emp_pay check (pay_rate > 12.50)

6.預設約束

add constraint df_stuaddress default (『位址不詳』) for stuaddress

–新增預設約束(如果位址不填,預設為「位址不詳」)

總結:

使用約束的要點

首先必須理解資料庫中各個表之間的關係,看看哪些表依賴於別的表,哪些列依賴於別的列,哪些可以可空還是必須有資料

使用約束的次序

當使用create table命令建立約束時或者用alter table命令在表上新增約束時,必須以正確的順序制定約束,例如必須在定義參照某個主鍵的外來鍵時,必須先定義這個主鍵。如果想刪除乙個主鍵,必須先刪除參照這個主鍵的所有外來鍵。再譬如父子記錄,必須首先有父記錄,才能建立子記錄,刪除時必須先刪除子記錄,才能刪除父記錄。

二、索引

在表上建立索引以提高速度——快速的獲取資料

索引是一種基於表中資料的物件,與view不同,索引需要占用物理儲存。它提供的資料順序不同於屬於在磁碟上的物理儲存資料,特殊作用就是在表內重新排列記錄的物理位置,索引基於表的一列或多列組合建立。通常在正確的字段上建立索引,可以使效能顯著的提高,特別是在表之間的連線欄位上建立索引。

技巧復合索引

create index id_cmpd_index on bills(account_id,amount); –即使兩個字段相結合,也只是建立了乙個實際的索引。

unique 唯一性索引

由於主鍵中的每個值必須是唯一的,所以資料庫將隱含的建立索引,主鍵和唯一約束都使系統生成索引。

聚簇索引

主鍵一般是應該設為聚集索引的,但業界現在有了新的認識,主鍵主要意義在於「唯一標識記錄」,而索引主要是「提高資料庫效能」,尤其是「聚集索引」。

而現在我會注重資料庫索引的建立,最關鍵的就是聚集索引,「聚集索引」與「非聚集索引」的理解很簡單:「聚集索引」就是物理上的排列方式,而「非聚集索引」是使用索引表(相當於書的目錄),使用索引之所以能提高效能,也就是「避免全表掃瞄」。

因此乙個表只能有乙個「聚集索引」,因為在物理上,不可能會有「兩種」物理存放方式吧。也真是如此「聚集索引」對查詢效能的影響最大,所以要非常注意「聚集索引」的建立,我目前意識到、也是freedk所推薦的「單據日期」作為聚集索引,我說的「單據日期」是指日常業務性的記錄,一般都是會有乙個日期欄位的,而80%查詢中都會用到此」日期字段」,而且把它放在where的第乙個效果最佳,因為會在指定的區域內進行其他條件的查詢,範圍少了很多很多,效能效果提高明顯。

至於其他的索引,這只要根據業務的需要,對於一些會進行查詢的字段進行一定的索引,也就是盡可能的「避免全表掃瞄」就可以提高系統效能。當然過多的索引也會引起系統負擔,想想要建那麼多「目錄」自然會增加負擔了。

還有「聚集索引」由於是物理儲存的,效能上固然是提高了,但對於插入與刪除,會引起資料的「移動」(在中間插入一條記錄,會引起後半部分記錄的後移),當然資料庫有自己的儲存機制,會採用「頁」來進行分塊儲存,可以避免一定的「移動」,所以「聚集索引」最好是在「大部分」情況下可以「遞增」,我們目前採用的「單據日期」也剛好是符合這個條件的。

避免全表掃瞄

如果沒有索引,當執行select或者更新的時候就會執行全表掃瞄,嚴重的影響sql的效能。應該分析資料庫的執行過程,找到經常需要查詢的字段(where子句的),將之使用索引,或者聚集索引(只能有乙個聚集索引)以提供效能。 但有時全表掃瞄又是必須的:例如從乙個表中幾乎需要選擇所有的表、修改表中的所有的行、表比較小。

另:注意不要使用 %a% 以及 in or這類語句,這會使索引實效,(索引帶來的range query時的便利會因為無法同時判斷兩個條件(where f1>100 or f2<50)而消失)

mysql 索引與約束 mysql約束與索引的區別

摘自 一 約束 作用 是為了保證資料的完整性而實現的摘自一套機制,它具體的根據各個不同的資料庫的實現而有不同的工具 約束 這裡主要講解mysql的約束 1 非空約束 not null 指示某列不能儲存null 值 2 唯一約束 unique uk unique約束的字段,要求必須是唯一的,但null...

約束與索引

非空約束 not null create table emp emp id nvarchar 9 not null,emp name nvarchar 50 not null,當一列被建立時,可以使用not null約束,空值null 等於沒有或未知道,該錶的兩個列不允許插入null或者不設定值。主...

約束與索引

非空約束 not null create table emp emp id nvarchar 9 not null,emp name nvarchar 50 not null,當一列被建立時,可以使用 not null 約束,空值 null 等於沒有或未知道,該錶的兩個列不允許插入 null 或者不...