第十章
使用約束強制數據完整性
Data Integrity
•資料的完整性
–確保該列中的任何一列的值在可接受的值是
•個體的完整性
–確保可以唯一標識在每一資料表的每一行
•參考性的完整性
–當一個值儲存的時候,必需確保在其他的表格內可以找到
•Constraint
•約束是一個CREATE TABLE語句的元素,執行數據完整性的三種類型之一
•Domain Integrity
•資料的完整性 ,確保在可接受的值是該列中的任何一列的值
•Check Constraint
•在新增和更新的時候檢查並約束強值的完整性
•Column-Level Check Constraint
•Create table table_name(
column_name datatype[ NULL | NOT NULL | IDENTITY ]
[ constraint constraint_name ]
check ( condition_using_column_name ),
…
column_name datatype [ NULL | NOT NULL | IDENTITY ]
)
•如果constraint_name不去命名的話,系統會自動給於名稱,建議自行命名
•多列檢查約束可以在列級或表級聲明
•可以有多個單個列的檢查約束。這是非常有用的,當兩個或兩個以上的限制,適用於一列,insert時失敗,你想知道這違反了規則
•Table-Level Check Constraint
•Create table table_name (
column_name datatype [ NULL | NOT NULL | IDENTITY ],
…
column_name datatype [ NULL | NOT NULL | IDENTITY ],
[ constraint constraint_name ]
check ( condition_involving_any_column_or_columns)
)
•表級Check Constraint只能引用任何表中的列
•如果有兩個或兩個以上的表級約束,除了最後的每一個表級約束,必須終止一個逗號
•Check Constraints and Defaults
•Adaptive Server允許有一個默認表檢查約束,互相矛盾
–任何使用默認的插入會失敗
Entity Integrity
•確保可以唯一標識在每一資料表的每一行
•Primary Key
•唯一的一個或多個列的組合的身份,在一個表的每一行
•主鍵約束強制執行實體完整性
•它指定的列上創建唯一索引
•在插入和更新時,強制執行的完整性
•限制每個表的一個主鍵約束
•主鍵約束創建的索引
•Unique
•Clustered by default
•不可以是NULL值
–不能創建空列
•不能使用DROP INDEX語句刪除
•Column-Level Primary Key Constraint
•create table table_name(
column_name datatype [NOT NULL | IDENTITY]
[constraint constraint_name]
primary key [clustered | nonclustered],
…
column_name datatype [NOT NULL | IDENTITY]
)
•Table-Level Primary Key Constraint
•create table table_name (
column_name datetype [ NULL | NOT NULL | IDENTITY ],
…
column_name datatype [ NULL | NOT NULL | IDENTITY ],
[ constraint constraint_name ]
primary key [ clustered | nonclustered ] ( column1[, column2 … ] )
)
•多列主鍵約束,必須在表級別聲明
•Unique Constraint
•唯一約束也強制執行實體完整性
•它指定的列上創建唯一索引
•在插入和更新時,強制執行的完整性
•表中可以有多個唯一約束
•唯一約束創建的索引
•Unique
•Nonclustered by default
•可以擁一個NULL值
–能創建空列
•不可以被drop index
•Column-Level Unique Constraint
•create table table_name(
column_name datatype [NULL | NOT NULL | IDENTITY]
[constraint constraint_name]
unique [clustered | nonclusterd],
…. column_name datatype [NULL | NOT NULL | IDENTITY ]
)
•Table-Level Unique Constraint
•create table table_name (
column_name datatype [ NULL | NOT NULL | IDENTITY],
…
column_name datatype [ NULL | NOT NULL | IDENTITY ],
[ constraint constraint_name ]
unique [ clustered | nonclustered ] ( column1 [, column2 … ] )
)
•多列唯一約束,必須在表級別聲明
Referential Integrity
•當一個值儲存的時候,必需確保在其他的表格內可以找到
•Foreign Key
•外鍵是另一個表的主鍵對應一個或多個列的組合
•引用約束強制參照完整性
•約束是執行過程中新增,更新和刪除
–如果新增或更新包含外鍵的值中不存在主鍵列,回報失敗
–如果更新或刪除試圖刪除一個主鍵值存在一個相應的外鍵,語句失敗
•Column-Level References Constraint
•create table table_name(
column_name datatype [NULL | NOT NULL | IDENTITY]
[constraint constraint_name]
references table_name(primary_key_column),
…
column_name datatype [NULL | NOT NULL | IDENTITY]
)
•Table-Level References Constraint
•create table table_name (
column_name datatype [ NULL | NOT NULL | IDENTITY ],
…
column_name datatype [ NULL | NOT NULL | IDENTITY ],
[ constraint constraint_name ]
foreign key ( list_of_columns_from_this_table)
references table_name ( primary_key_column_list )
)
•多重引用約束,必須在表級別上宣布
•規則
•在子表引用約束父表中的列必須有下列之一
–主鍵約束
–唯一約束
–使用CREATE index命令創建一個唯一的索引
•限制
•修改主鍵的值
–不能更新或刪除,如果值中存在任何外鍵
•修改外鍵值
–無法插入或更新,如果不存在新值,在對應的主鍵
•刪除主鍵的表
–如果任何外鍵引用的主鍵不能刪除表
Constraint
•Constraints並不會對已經存在的資料做限制
•Adding
•alter table table_name
•add constraint constraint_name
•{check (condition) | primary key (column_list) | uqique (column_list) | foreign key (column_list) references table (column_list)}
•Dropping
•alter table table_name
•drop constraint constraint_name
•Constraint Message
•System-Defined Constraint Message
•系統定義的約束消息顯示,當一個語句失敗是由於一個約束衝突
•User-Defined Constraint Messages
•可以自行定義約束消息
•建立
–sp_addmessage message_number, “message_text”
•給予
–sp_bindmsg constraint_name, message_number
•解除
–sp_unbindmsg constraint_name
•刪除
–sp_dropmessage message_number
•sp_helpconstraint table_name
–查詢特定資料表中的約束訊息
•sp_remame old_constraint_name, new_constraint_name
–修改訊息的名稱