數據庫五大約束條件

分類:小喵學堂     發布時間:2018-07-03 16:16:31
分享到 :

五大約束

1.—-主鍵約束(Primay Key Coustraint) 唯一性,非空性

2.—-唯一約束 (Unique Counstraint)唯一性,可以空,但只能有一個

3.—-檢查約束 (Check Counstraint) 對該列數據的范圍、格式的限制(如:年齡、性別等)

4.—-默認約束 (Default Counstraint) 該數據的默認值

5.—-外鍵約束 (Foreign Key Counstraint) 需要建立兩表間的關系并引用主表的列


五大約束的語法示例

1.—-添加主鍵約束(將stuNo作為主鍵)

alter table stuInfo

add constraint PK_stuNo primary key (stuNo)

2.—-添加唯一約束(身份證號唯一,因為每個人的都不一樣)

alter table stuInfo

add constraint UQ_stuID unique(stuID)

3.—-添加默認約束(如果地址不填 默認為“地址不詳”)

alter table stuInfo

add constraint DF_stuAddress default (‘地址不詳’) for stuAddress

4.—-添加檢查約束 (對年齡加以限定 15-40歲之間)

alter table stuInfo

add constraint CK_stuAge check (stuAge between 15 and 40)

alter table stuInfo

add constraint CK_stuSex check (stuSex=’男’ or stuSex=’女′)

5.—-添加外鍵約束 (主表stuInfo和從表stuMarks建立關系,關聯字段stuNo)

alter table stuInfo

add constraint FK_stuNo foreign key(stuNo)references stuinfo(stuNo)


 約束(Constraint)是Microsoft SQL Server 提供的自動保持數據庫完整性的一種方法,定義了可輸入表或表的單個列中的數據的限制條件(有關數據完整性的介紹請參見第9 章)。在SQL Server 中有5 種約束:主關鍵字約束(Primary Key Constraint)、外關鍵字約束(Foreign Key Constraint)、惟一性約束(Unique Constraint)、檢查約束(Check Constraint)和缺省約束(Default Constraint)。


1、主關鍵字約束

主關鍵字約束指定表的一列或幾列的組合的值在表中具有惟一性,即能惟一地指定一行記錄。每個表中只能有一列被指定為主關鍵字,且IMAGE 和TEXT 類型的列不能被指定為主關鍵字,也不允許指定主關鍵字列有NULL 屬性。

定義主關鍵字約束的語法如下:

CONSTRAINT constraint_name

PRIMARY KEY [CLUSTERED | NONCLUSTERED]

(column_name1[, column_name2,…,column_name16])

各參數說明如下:

constraint_name

指定約束的名稱約束的名稱。在數據庫中應是惟一的。如果不指定,則系統會自動生成一個約束名。

CLUSTERED | NONCLUSTERED

指定索引類別,CLUSTERED 為缺省值。其具體信息請參見下一章。

column_name

指定組成主關鍵字的列名。主關鍵字最多由16 個列組成。


例7-3: 創建一個產品信息表,以產品編號和名稱為主關鍵字

create table products (

p_id char(8) not null,

p_name char(10) not null ,

price money default 0.01 ,

quantity smallint null ,

constraint pk_p_id primary key (p_id, p_name)

) on [primary]


2、外關鍵字約束

外關鍵字約束定義了表之間的關系。當一個表中的一個列或多個列的組合和其它表中的主關鍵字定義相同時,就可以將這些列或列的組合定義為外關鍵字,并設定它適合哪個表中哪些列相關聯。這樣,當在定義主關鍵字約束的表中更新列值,時其它表中有與之相關聯的外關鍵字約束的表中的外關鍵字列也將被相應地做相同的更新。外關鍵字約束的作用還體現在,當向含有外關鍵字的表插入數據時,如果與之相關聯的表的列中無與插入的外關鍵字列值相同的值時,系統會拒絕插入數據。與主關鍵字相同,不能使用一個定義為 TEXT 或IMAGE 數據類型的列創建外關鍵字。外關鍵字最多由16 個列組成。

定義外關鍵字約束的語法如下:

CONSTRAINT constraint_name

FOREIGN KEY (column_name1[, column_name2,…,column_name16])

REFERENCES ref_table [ (ref_column1[,ref_column2,…, ref_column16] )]

[ ON DELETE { CASCADE | NO ACTION } ]

[ ON UPDATE { CASCADE | NO ACTION } ] ]

[ NOT FOR REPLICATION ]

各參數說明如下:


REFERENCES

指定要建立關聯的表的信息。

ref_table

指定要建立關聯的表的名稱。

ref_column

指定要建立關聯的表中的相關列的名稱。

ON DELETE {CASCADE | NO ACTION}

指定在刪除表中數據時,對關聯表所做的相關操作。在子表中有數據行與父表中的對應數據行相關聯的情況下,如果指定了值CASCADE,則在刪除父表數據行時會將子表中對應的數據行刪除;如果指定的是NO ACTION,則SQL Server 會產生一個錯誤,并將父表中的刪除操作回滾。NO ACTION 是缺省值。

ON UPDATE {CASCADE | NO ACTION}

指定在更新表中數據時,對關聯表所做的相關操作。在子表中有數據行與父表中的對應數據行相關聯的情況下,如果指定了值CASCADE,則在更新父表數據行時會將子表中對應的數據行更新;如果指定的是NO ACTION,則SQL Server 會產生一個錯誤,并將父表中的更新操作回滾。NO ACTION 是缺省值。

NOT FOR REPLICATION

指定列的外關鍵字約束在把從其它表中復制的數據插入到表中時不發生作用。

例7-4:創建一個訂貨表,與前面創建的產品表相關聯

create table   orders(

order_id char(8),

p_id char(8),

p_name char(10) ,

constraint pk_order_id primary key (order_id) ,

foreign key(p_id, p_name) references products(p_id, p_name)

) on [primary]

注意:臨時表不能指定外關鍵字約束。


3、惟一性約束

惟一性約束指定一個或多個列的組合的值具有惟一性,以防止在列中輸入重復的值。惟一性約束指定的列可以有NULL 屬性。由于主關鍵字值是具有惟一性的,因此主關鍵字列不能再設定惟一性約束。惟一性約束最多由16 個列組成。

定義惟一性約束的語法如下:

CONSTRAINT constraint_name

UNIQUE [CLUSTERED | NONCLUSTERED]

(column_name1[, column_name2,…,column_name16])

例7-5:定義一個員工信息表,其中員工的身份證號具有惟一性。


create table employees (

emp_id char(8),

emp_name char(10) ,

emp_cardid char(18),

constraint pk_emp_id primary key (emp_id),

constraint uk_emp_cardid unique (emp_cardid)

) on [primary]

4、檢查約束

檢查約束對輸入列或整個表中的值設置檢查條件,以限制輸入值,保證數據庫的數據完整性??梢詫γ總€列設置符合檢查。

定義檢查約束的語法如下:

CONSTRAINT constraint_name

CHECK [NOT FOR REPLICATION]

(logical_expression)

各參數說明如下:

NOT FOR REPLICATION

指定檢查約束在把從其它表中復制的數據插入到表中時不發生作用。

logical_expression

指定邏輯條件表達式返回值為TRUE 或FALSE。

例7-6: 創建一個訂貨表其中定貨量必須不小于10。

create table   orders(

order_id char(8),

p_id char(8),

p_name char(10) ,

quantity smallint,

constraint pk_order_id primary key (order_id),

constraint chk_quantity check (quantity>=10) ,

) on [primary]

注意:對計算列不能作除檢查約束外的任何約束。


5、缺省約束

缺省約束通過定義列的缺省值或使用數據庫的缺省值對象綁定表的列,來指定列的缺省值。SQL Server 推薦使用缺省約束,而不使用定義缺省值的方式來指定列的缺省值。有關綁定缺省約束的方法請參見“數據完整性”章節。

定義缺省約束的語法如下:

CONSTRAINT constraint_name

DEFAULT constant_expression [FOR column_name]

例7-7:

constraint de_order_quantity default 100 for   order_quantity

注意:不能在創建表時定義缺省約束,只能向已經創建好的表中添加缺省約束。


7.2.6 列約束和表約束

對于數據庫來說,約束又分為列約束(Column Constraint)和表約束(Table Constraint)。

列約束作為列定義的一部分只作用于此列本身。表約束作為表定義的一部分,可以作用于

多個列。

下面舉例說明列約束與表約束的區別。

例7-8:

create table products (

p_id char(8) ,

p_name char(10) ,

price money default 0.01 ,

quantity smallint check (quantity>=10) , /* 列約束 */

constraint pk_p_id primary key (p_id, p_name) /* 表約束 */


注:

    1. 添加主鍵約束會自動創建唯一索引。如果表中尚未創建 聚焦索引,則自動創建聚焦唯一索引。如果表中已存在聚焦索引,則自動創建非聚焦索引。

    2. 添加唯一約束會自動創建唯一索引。如果未在unique關鍵字后加上[nonclustered|clustered],則默認會創建非聚焦索引。