數據完整性用於保證數據庫中數據的正確性、一致性和可靠性。
2 類型
• 實體完整性(Entity Integrity)
• 域完整性(Domain Integrity)
• 參照完整性(Referential Integrity)
• 用戶定義完整性(User-defined Integrity)
圖示
實體完整性(Entity Integrity)
實體完整性用於保證數據庫中數據表的每一個特定實體的記錄都是唯一的 。
約束種類 功能描述
PRIMARY KEY(主鍵)約束 唯一識別每一條記錄的標誌,可以有多列共同組成
IDENTITY(自增)約束 列值自增,一般使用此屬性設置的列作爲主鍵
UNIQUE(唯一)約束 可以使用UNIQUE約束確保在非主鍵列中不存在重複值,但列值可以是NULL(空)
域完整性是指保證指定列的數據具有正確的數據類型、格式和有效的數據範圍。
CHECK(檢查)約束 用於限制列中值得範圍
FOREIGN KEY(外鍵) 一個表中的FORENIGN KEY 指向另一個表中的PRIMARY KEY
DEFAULT(默認值)約束 用於向列中插入默認值
NOT NULL(非空)約束 用於強制列不接受NULL(空)值
當增加、修改或刪除數據庫表中記錄時,可以藉助參照完整性來保證相關聯表之間數據的一致性 。
用戶定義完整性 (User- defined Integrity)
這是由用戶定義的完整性。用戶定義完整性可以定義不屬於其他任何完整性分類的特定業務規則 。
注意:
1、PRIMARY KEY用於將表中的某類設置爲主鍵,一張表中只有一個主鍵,主鍵可以是一列或由多列組成。
2、NOT NULL是對列值進行限制,即在表中添加數據時不允許有NULL值。
3、CHECK約束的語法規則:CHECK(表達式)
外鍵的使用:字段名 數據類型 [FOREIGN KEY] REFERENCES 表名(字段名)
===================================
3 數據完整性的實現方式
(1)使用IDENTITY(標識符)列
語法格式:
CREATE TABEL 數據表名
(列名 列數據類型 IDENTITY [(種子, 增量)] [,…])
說明:標識種子爲標識列的起始值,標識遞增量爲每次增加的數,二者的默認值均爲1。
(2)使用IDENTITY函數
語法格式:
IDENTITY ( 數據類型 [ , 種子 , 遞增量 ] ) AS 列名
說明:只用在帶有 INTO table 子句的 SELECT 語句中,可以將標識列插入到新表中。
儘管類似,但是 IDENTITY 函數不是與 CREATE TABLE 和 ALTER TABLE 一起使用的 IDENTITY 屬性。
完整性類型 約束類型 描述
域 DEFAULT 指定列的默認值
CHECK 指定列的允許值
FOREIGN KEY 指定必須存在值的列
NULL 指定是否允許爲NULL
實體 PRIMARY KEY 唯一標識每一行
UNIQUE 防止非主鍵重複
引用 FOREIGN KEY 定義值與同一個表或另一個表的主鍵值匹配的一列或多列組合
CHECK 指定根據同一個表中其他列的值可在列中接受的數據值
在SQL SERVER中,對於基本表的約束分爲列約束和表約束。
完整性約束的基本語法格式爲:
[CONSTRAINT constraint_name(約束名)] <約束類型>
約束不指定名稱時,系統會給定一個名稱。
在SQL Server 2005中有6種約束:主鍵約束(primary key constraint)、惟一性約束(unique constraint)、檢查約束(check constraint)、默認約束(default constraint)、外部鍵約束(foreign key constraint)和空值(NULL)約束。
PRIMARY KEY 約束
PRIMARY KEY約束用於定義基本表的主鍵,它是惟一確定表中每一條記錄的標識符,其值不能爲NULL,也不能重複,以此來保證實體的完整性。PRIMARY KEY與UNIQUE約束類似,通過建立唯一索引來保證基本表在主鍵列取值的唯一性,但它們之間存在着很大的區別:
①一個表只能有一個 PRIMARY KEY 約束 ,但可定義多個UNIQUE約束;
②對於指定爲PRIMARY KEY的一個列或多個列的組合,其中任何一個列都不能出現空值,而對於UNIQUE所約束的唯一鍵,則允許爲空。
注意:不能爲同一個列或一組列既定義UNIQUE約束,又定義PRIMARY KEY約束;
PRIMARY KEY既可用於列約束,也可用於表約束。
(2)使用Transact-SQL語句操作法設置主鍵約束,其語法形式如下:
PRIMARY KEY
CONSTRAINT constraint_name PRIMARY KEY ( column_name )
舉例:建立一個SC表,定義SNO,CNO共同組成SC的主鍵
程序清單如下:
create table sc(
sno char(5) not null,
cno char(5) not null,
score numeric (3),
constraint sc_prim primary key(sno,cno)
)
UNIQUE約束
惟一性約束用於指定一個或者多個列的組合值具有惟一性,以防止在列中輸入重複的值。定義了UNIQUE約束的那些列稱爲唯一鍵,系統自動爲唯一鍵建立唯一索引,從而保證了唯一鍵的唯一性。
當使用惟一性約束時,需要考慮以下幾個因素:
• 使用惟一性約束的字段允許爲空值;
• 一個表中可以允許有多個惟一性約束;
• 可以把惟一性約束定義在多個字段上;
• 惟一性約束用於強制在指定字段上創建一個惟一性索引;
• 默認情況下,創建的索引類型爲非聚集索引。
使用Transact-SQL語句完成惟一性約束的操作,其語法形式如下:
• UNIQUE
• CONSTRAINT constraint_name UNIQUE ( column_name )
CHECK 約束
檢查約束對輸入列或者整個表中的值設置檢查條件,以限制輸入值,保證數據庫數據的完整性。
當使用檢查約束時,應該考慮和注意以下幾點:
• 一個列級檢查約束只能與限制的字段有關;一個表級檢查約束只能與限制的表中字段有關;
• 一個表中可以定義多個檢查約束;
• 每個CREATE TABLE語句中每個字段只能定義一個檢查約束;
• 在多個字段上定義檢查約束,則必須將檢查約束定義爲表級約束;
• 當執行INSERT語句或者UPDATE語句時,檢查約束將驗證數據;
• 檢查約束中不能包含子查詢。
用Transact-SQL語句創建檢查約束。其語法形式如下:
• CONSTRAINT constraint_name CHECK (logical_expression)
• CHECK (logical_expression)
create table sc(
sno char(5) not null,
cno char(5) not null,
score numeric(5,1) constraint score_chk check(score>=0 and score <=100),
constraint sc_prim primary key(sno,cno),
)
drop table sc
insert into sc values('1','2',3)
DEFAULT 約束
默認約束指定在插入操作中如果沒有提供輸入值時,則系統自動指定值。默認約束可以包括常量、函數、不帶變元的內建函數或者空值。
使用默認約束時,應該注意以下幾點:
(1)每個字段只能定義一個默認約束;
(2)如果定義的默認值長於其對應字段的允許長度,那麼輸入到表中的默認值將被截斷;
(3)不能加入到帶有IDENTITY屬性或者數據類型爲timestamp的字段上;
(4)如果字段定義爲用戶定義的數據類型,而且有一個默認綁定到這個數據類型上,則不允許該字段有默認約束。
創建默認約束的Transact-SQL語句操作法。其語法形式如下:
• CONSTRAINT constraint_name DEFAULT constraint_expression [FOR column_name]
• DEFAULT constraint_expression [FOR column_name]
舉例:爲 dept字段創建默認約束。
程序清單如下:
constraint con_dept default ‘計算機’ for dept
NULL 約束
空值約束用來控制是否允許該字段的值爲NULL。NULL值不是0也不是空白,更不是填入字符串的“NULL”字符串,而是表示“不知道”、“ 不確定”或“沒有數據”的意思。
當某一字段的值一定要輸入纔有意義的時候,則可以設置爲NOT NULL。如主鍵列就不允許出現空值,否則就失去了唯一標識一條記錄的作用。空值約束只能用於定義列約束。
FOREIGN KEY 約束
FOREIGN KEY約束是用於建立和加強兩個表數據之間的鏈接的一列或多列。外部鍵約束用於強制參照完整性。
FOREIGN KEY 約束確保同一個表或者不同表之間的引用完整性
必須引用一個PRIMARY KEY或者UNIQUE約束
用戶必須在應用表上具有REFERENCES權限
一個表中最多可以有31個外部鍵約束;
在臨時表中,不能使用外部鍵約束;
主鍵和外部鍵的數據類型必須嚴格匹配 。
使用Transact-SQL語句設置外部鍵約束 ,其語法形式如下:
CONSTRAINT constraint_name
FOREIGN KEY (column_name[,…n])
REFERENCES ref_table [(ref_column[,…n])]
ALTER TABLE [Sales].[SalesOrderHeader] WITH CHECK
ADD CONSTRAINT [FK_SalesOrderHeader_Customer_CustomerID]
FOREIGN KEY([CustomerID])
REFERENCES [Sales].[Customer] ([CustomerID])
禁用 CHECK 和 FOREIGN KEY 約束:
當運行大型批處理作業時提高性能
當向表中添加新的約束的時候避免檢查已經存在的數據
=============================
必須會的SQL語句:數據庫的完整性約束
實體完整性
http://www.cnblogs.com/sixbeauty/p/4016284.html