數據庫中的完整性約束及實例

1 定義 
    數據完整性用於保證數據庫中數據的正確性、一致性和可靠性。 
2    類型 
• 實體完整性(Entity Integrity) 
• 域完整性(Domain Integrity) 
• 參照完整性(Referential Integrity) 
• 用戶定義完整性(User-defined Integrity) 
 圖示 

實體完整性(Entity Integrity) 

實體完整性用於保證數據庫中數據表的每一個特定實體的記錄都是唯一的 。

  約束種類                                      功能描述
  PRIMARY KEY(主鍵)約束                         唯一識別每一條記錄的標誌,可以有多列共同組成
  IDENTITY(自增)約束                            列值自增,一般使用此屬性設置的列作爲主鍵
  UNIQUE(唯一)約束                              可以使用UNIQUE約束確保在非主鍵列中不存在重複值,但列值可以是NULL(空)

域完整性(Domain Integrity) 

域完整性是指保證指定列的數據具有正確的數據類型、格式和有效的數據範圍。 

  CHECK(檢查)約束                                用於限制列中值得範圍
  FOREIGN KEY(外鍵)                              一個表中的FORENIGN KEY 指向另一個表中的PRIMARY KEY
  DEFAULT(默認值)約束                            用於向列中插入默認值
  NOT NULL(非空)約束                             用於強制列不接受NULL(空)值

參照完整性(Referential Integrity) 
當增加、修改或刪除數據庫表中記錄時,可以藉助參照完整性來保證相關聯表之間數據的一致性 。
用戶定義完整性 (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語句:數據庫的完整性約束 
實體完整性


1.建表時定義主鍵
  Create table 表名
   (
        Sno int identity(1,1),
        Sname nvarchar(20),
        --設置主鍵
        Primary key (Sno)
   )
 
2.添加主鍵
    alter table 表名
    add constraint PK_表名_Sno
    primary key(id)
 
參照完整性
 
1.建表時定義外鍵
  create table 表名
  (
      sno int identity(1,1) primary key,
      cno int not null,
      foreign key(cno) References
      表名2(Cno)
      on Delete cascade     --級聯刪除
      on update cascade    --級聯更新
      -- on delete on action  刪除管制
  )
 
2.添加外鍵
   alter table 表名
   add constraint FK_表名_表名2
   Foreign key(cid) references 表名2(cid)
 
用戶定義完整性
 
1.非空約束
   alter table 表名
   alter column name varchar(20) not null
 
2.唯一約束
   alter table 表名
   add constraint UQ_表名_列名 unique(列)
 
3.檢查約束
   alter table 表名
   add constraint CK_表名_列名 check(age>5)
 
4.默認約束
   alter table 表名
   add constraint DF_表名_列名 default('男')
   for gender
 
刪除約束
    --刪除約束
   alter table 表名 drop constraint DF_表名_列

ref:http://yinxiangbing.iteye.com/blog/673768
另可參考:http://blog.csdn.net/xiang462042190/article/details/40658427

http://www.cnblogs.com/sixbeauty/p/4016284.html

發佈了23 篇原創文章 · 獲贊 144 · 訪問量 120萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章