設計數據完整性

1:什麼是數據完整性
2:數據完整性的分類
3:用約束實施完整性
4:用主鍵實施完整性 
5:用unique約束實施完整性

A:什麼是數據完整性
  數據庫中的數據的正確性和相容性.設計數據庫的完整性的目的是爲了防止數據庫中存在不符合語義的數據,防止錯誤信息的輸入,主要包含以下幾個方面的內容
    A:數據類型必須正確.比如:一個姓名決不可能是數值型
    B:數據值必須處於正確的範圍內:如工人的年齡應該是20----50歲之間
    C:數據的存在必須能夠確保同一表格數據之間的和諧關係
       例如:已存在一個職工編號爲01的職工,則不允許出現另外一個01的職工
    D:數據的存在必須能夠確保維護不同表格的數據之間的和諧關係
       例如:work表中有某個職工屬於某個部門,則部門表也應該對這個部門作了記錄

B:數據完整性的分類:
  1:實體完整性:實體完整性的基本思想是標識數據中存放的每一個實體.每一個實體都要求保持唯一性.
     例如:有work表:職工號,姓名,性別....在這個表中要使每個工人都不相同,可以設置職工號爲“主鍵”
  2:值域完整性:表中的每個字段取值必須符合邏輯.
     例如:性別只能是男或女,年齡不能爲負數,職工號決不能爲null.
  3:引用完整性:引用完整性是在插入或刪除數據時,維護表格間數據一致性的手段.
     例如:
          職工工資表                    職工住址表
     職工號  職稱  基本工資       職工號  姓名  性別  地址
     01      經理   1000           01    張三   男   北京
     02      廠長   1500           02    李四   女   南京
在“職工工資表”中增加一個新的職工時,爲了保證“職工工資表”與“職工住址表”的對應關係,一定也要在“職工住址表”中添加相應的記錄.若要刪除“職工工資表”中“01”的這個職工時,也要對應地在“職工住址表”中刪除“01”這個職工.
  4:用戶自定義完整性
     用戶自定義完整性主要是體現實際運用的業務規則,例如:
     規定 基本工資>100並且<6000等.再如:規定姓名中不許出現有“張”姓等

sql server實施數據完整性的途徑
sql server主要使用三種方式來實施數據完整性:使用約束,使用規則,使用默認值,使用標識列.

C:使用約束來實施數據完整性 
約束(constraint)的用途是限制輸入到表中的值的範圍.sql server根據不同的用途提供了多種約束
   1:primary key [主鍵]約束
   2:foreign key [外鍵]約束
   3:unique [唯一]約束
   4:check  [覈查]約束
約束可以分爲表級約束和列級約束兩種.
列級約束:列級約束是行定義的一部分,只能應用於一列上.
表級約束:表級約束是獨立於列的定義,可以應用在一個表中的多列上.

D:用主鍵實施完整性
  1:primary key約束利用表中的一列或多列數據來唯一地標識一個記錄.在表中絕對不允許有主鍵相同的行存在,受主鍵約束的列決不能爲null值,一個表只能有一個主鍵,對主鍵操作的方式有三種
    A:在創建表格時定義主鍵,主鍵是定義表格的一部分.
        格式:create table 表名
            (列名1 數據類型1,
             列名2 數據類型2,
            [constraint 約束名] primary key(列名1,列名2...列名n) 
             ...)
        比如:create table ww 
             (職工編號 varchar(10),
             姓名 varchar(10),
             primary key (職工編號))
        說明:可以省略了“constraint 約束名”,系統會自動加上去.但建議用戶取一個名字.因爲如果以後要刪除這個約束時,將因不知道該約束的名字而沒有辦法刪除.

      創建表級主鍵約束.
          create table 班級學生
                 (班級 varchar(10) not null,
                  學號 varchar(10) not null
                  姓名 varchar(10),
                  constraint a[約束名] primary key (班級,學號)) 
     B:在一個沒有定義主鍵的表上添加一個主鍵
       格式:alter table 表名
            add [contraint 約束名] 
            primary key(列名1..列名n)
       比如:先定義一個表work 
            create table work
            (職工號 varchar(10) not null,
             姓名 varchar(10),
             性別 varchar(10))  
       然後再執行:       
            alter table work
            add [constraint 職工號]
            primary key(職工號)
       試定義一個表
            create table 班級學生
            (班級 varchar(10) not null,
             學號 varchar(10) not null,
             姓名 varchar(10)) 
       然後以班級和學號建一個表級主鍵:
            alter table 班級學生
            add [constraint 班級,學號] 
            primary key (班級,學號) 
       說明:當在一個已經存放了數據的表上增加主鍵時,sql server會自動對錶中的數據進行檢查,以確保這些數據能否滿足主鍵約束.當向不符合主鍵要求的表中增加主鍵時,sql server會返回錯誤信息並拒絕加入主鍵.
       試一試:create table 職工管理
              (職工編號 varchar(10), 
               姓名 varchar(10),
               性別 varchar(10))
       再執行:alter table 職工管理 
              add constraint 職工號 primary key(職工號)

     C:修改或刪除表上已建立的主鍵 
       說明:1:修改表上已建立的主鍵時,只能先刪除原先的主鍵後再重新建立一個新的主鍵
            2:刪除主鍵的格式:alter table 表名 drop 主鍵名
            3:當主鍵被別的外鍵作用時,不允許刪除主鍵需先將引用主鍵的外鍵刪除.
              把work1表與部門表作一個外鍵.
              把work1的職工號作爲主鍵,把部門表的部門編號作爲主鍵
                主鍵表    外鍵表
                部門表    work1
              試着去執行語句:alter table 部門 drop pk_部門 [看能否成功]
              通過企業管理器:添加,刪除,修改主鍵

E:使用unique約束
   unique約束是用來確保不受主鍵約束列上的數據的唯一性.
   unique與primary key的區別在於:
    1:unique約束主要用於非主鍵的一列或多列上要求數據唯一.
    2:unique約束允許該列上存在NULL值,而主鍵決不允許出現.
    3:可以在一個表創建多個unique約束,而在一個表上只能夠設置一個主鍵
       對unique的執行操作方式也有3種
         1:在創建表格時定義
           create table 表名
           (列名1  數據類型
            列名2  數據類型
              .
              .
            unique(列1,列2....列n))
        例如:create table 商品
            (商品編號 varchar(10),
             商品名 varchar(10),
             庫存量 int,
             單價 float,
             constraint 商品名 unique(商品名),
             constraint 商品編號 primary key(商品編號))
           2:在已經有數據但沒有重複值的列或列集合上添加unique
             格式:alter table 表名 
                  add constraint 約束名 unique(列1....列n)
             說明:當在一個已經存在的數據表上增加unique約束時,sql會自動對錶中的數據進行檢查,以確保這些數據能夠滿足unique約束的要求,即:除null外,所有的數據必須唯一,否則出錯並拒絕創建.
           3:修改或刪除表上已經定義的unique約束
             要修改一個unique約束與primary key一樣,必須先刪除該約束,然後再創建新的約束.
             刪除的格式是:alter table 表名 drop 約束名
           通過企業管理器來管理unique
6:用check約束實施完整性
7:使用外鍵實施完整性

F:使用check約束
check(覈查)約束通過檢查輸入表列的數據的值來維護值域的完整性,它就像一個門衛,依次檢查每一個要進入數據庫的數據,只有符合條件的數據才允許進入數據庫.
  例如:設置職工表的年齡在20---60之間應該用[age>=20 and age<=60]來約束.
       同前兩種約束一樣,check約束也有三種覈查約束的方式
    1:在創建表格時
       格式:create table 表名 
            (列名 數據類型,
                  .
                  .
            constraint 約束名 check (約束表達式))
       例如:create table 職工 
            (職工號 varchar(10),
             姓名 varchar(10),
             年齡 int,
             constraint 年齡 check (年齡>=20 and 年齡<=60))
    2:在已經創建的表上添加約束
當在一個已經存在的表上添加覈查時,覈查約束可以只應用於新的數據,也可以應用於新的和已經存在的數據.在默認情況下將同時應用於新的數據和已經存在的數據.
       格式:alter table 表名
           [with check|with nocheck]
            add constraint check 約束名 check (約束表達式)
說明:如果選擇with check則表示要對已經存在的數據進行檢驗,如果選擇with nocheck則表示不對以前的數據進行檢驗.如果選擇 with check,如果已經存在的數據與約束不符合則新建約束會失敗.
       例如:alter table work
            with nocheck 
            add constraint age check(age>20 and age<60)
            作一個年齡約束,不對現有數據進行覈查.如果省略with check選項或加上with check則表示對現有數據進行覈查,如果核查錯誤,則拒絕加入約束.

       A:試創建一個check約束:要求滿足
          1:如果是本科,基本工資>1200
          2:如果是大專,基本工資>1000
       B:試創建兩個條件相矛盾的約束,看一下sql server將如何處理.

    3:修改或刪除已經定義的check約束.
      1:要修改一個核查約束必須先刪除該約束,再創建一個同名的約束
        格式:alter table 表名 drop 約束名
      2:可以使用下面語句使所有的約束或指定的約束無效
在某些情況下,可以使用已經定義的核查約束無效(不是刪除約束),這就好像依然保留着門衛的崗位,但門衛已不再對進入數據庫的數據進行覈查.
比如說你已經在年齡上限制了必須[>20 and <60]而現在你必須插入一個年齡60的職工.則你可以先使約束無效,然後再插入數據,最後把約束生效.
      alter table 表名 
      check|nocheck constraint all|指定約束名
  例如:alter table work
       nocheck constraint age [使work中已經存在的age約束無效]
  再如:alter table work 
       nocheck constraint all [使work表中所有的約束都無效]

      使用企業管理器進行約束的創建
         A:創建中檢查現有數據:指出是否在創建約束時,對現有的數據進行檢查.
         B:對insert,update強制約束:如果選擇此項則用戶創建約束之後,向表插入記錄時,約束會檢查用戶所插入的記錄是否符合約束,如果不符合則拒絕用戶加入這些數據.
                 
G:使用外鍵(foreign key)實施完整性
外鍵約束主要用來維護兩個表之間一致性的關係.外鍵的建立主要是通過將一個表中的主鍵所在的列包含在另一個表中.這些列就是另外一個表的外鍵.
  比如:職工表[外鍵表][職工號,倉庫號,工資][以職工號作爲主鍵]
       倉庫表[主鍵表][倉庫號,城市,面積][以倉庫號作爲主鍵]
則“職工表”中的“倉庫號”就是“倉庫表”的外鍵,我們把職工表稱爲外鍵表,倉庫表稱爲主鍵表[切記].要創建外鍵必須滿足:“主鍵表”與“外鍵表”的列名和類型長度,都必須相同.

在創建表格時,創建外鍵
    格式:create table 外鍵表名
         (列名 類型
          ......
          constraint 外鍵名 foreign key(指定列名) references 主鍵表名(建立外鍵的字段))
    例如:假設已經存在“倉庫表”主鍵表,現在要創建一個外鍵表“職工表”並設置外鍵
          create table 職工
          (職工號 varchar(10),
           倉庫號 varchar(10), 
           工資 int,
           constraint 職工號 primary key(職工號),
           constraint 倉庫號 foreign key(倉庫號) references 倉庫(倉庫號)) 
    想一想爲什麼要加上: constraint 職工號 primary key (職工號):這一代碼.省略行不行?

  作業:創建一個職工銷售表與商品表,要求如下:
         職工銷售表(職工號,商品編號,數據)
         商品表(商品編號,商品名,單價,庫存量)
         現在用transact--SQL語句來設置外鍵,該怎麼樣設置.

  檢驗foreign key約束
     外鍵設置之後,能夠對維護表有什麼作用呢?下面詳細分析
     1:對外鍵表的限制
       當一行新的數據被加入到表格中,或者對錶格中已經存在的“外鍵”的數據進行修改時,新的數據或者爲NULL或者必須存於主鍵表中.即不能插入或修改“主鍵”表中沒有的信息.比如:在職工表與倉庫表中,職工表爲外鍵表而倉庫表爲主鍵表.這樣當我們在職工表中的倉庫號列中插入數據時,該倉庫號必須存在於倉庫表中.
     2:對主鍵表的限制
       當主鍵所在表的數據被“外鍵表”所引用時,用戶將無法對主鍵裏的數據進行修改或刪除.
       比如:如果外鍵表職工表中引用了主鍵表倉庫表中“WH3“這個倉庫號,則不能在主鍵表倉庫表裏來修改或刪除WH3這個字段值
     3:可以強制當主鍵所在表的數據被“外鍵”所使用時,用戶對主鍵的數據進行修改或刪除時使“外鍵”表的數據一起發生變化
       可以在創建外鍵時加上:
        A:on delete cascade|no action
          說明:cascade:表示在刪除與外鍵相應主鍵所在的行時,級聯刪除外鍵所在行的數據, 
               no action:表示不做任何操作,是默認值,即允許刪除
        B:on update cascade|no action 
          表示在對主鍵表進行更新時是否級聯刪除外鍵所在行.
        例如:constraint 倉庫號 foreign key(倉庫號) references 倉庫(倉庫號) on update cascade
     
    往已經存在的表中添加外鍵
當將外鍵約束添加到另一個已經存在數據的列上時,在默認情況下,sql server將會自動檢查表中已經存在的數據,以確保所有的數據都與主鍵保持一致,或者爲null,但是也可以根據需要設置sql server不對現有的數據進行外鍵約束檢查.
    格式:alter table 表名 with check|nocheck 
         add constraint 外鍵名 foreign key(指定列名) references 主鍵表名(創建外鍵的列名) 
         [on delete cascade|no action]
         [on update cascade|no action]
      如在職工表中添加一個外鍵,倉庫號
        alter table 職工 with check 
        add constraint 倉庫號 foreign key(倉庫號) references 倉庫(倉庫號)
        on delete cascade
        on update cascade

    修改或刪除外鍵
修改外鍵,必須把一個鍵刪除之後再重新建一個外鍵.刪除外鍵的格式爲:alter table 表名 drop 外鍵名
8:使用規則 
9:使用默認值
10:使用identity標識列

H:使用規則(rule)
規則是一組使用transact--SQL書寫的條件語句,它可和列捆綁在一起,當向綁定有規則的數據列上插入或修改值時,規則會檢測修改數據的完整性.

創建規則
   格式:create rule 規則名 as 規則描述
        規則描述:規則描述的條件表達式中可以包含數學運算符,關係運算符,以及諸如:in,like,between等關鍵字
   比如:create rule w 
        as @k>=20 and @k<=50 [創建一個規則讓k的取值在20----50之間]
   說明:1:規則描述用來定義規則的確切含義,規則中不能引用表中的數據列以及別的數據庫對象.
        2:規則應該包括一個局部變量,而且必須只能夠包含一個變量必須以@開頭.
   再如:create rule sex                    create rule te 
        as @sex in(/'男/',/'女/')              as @te like /'027-%/'

通過在企業管理器來創建規則

規則(rule)與約束(check)的區別
1:CHECK約束比規則更簡明,一個列只能應用一個規則,但是卻可以應用多個CHECK約束.
     舉例:先後在一個表中的一個列中綁定兩個規則,看一下是否能在一個列中綁定多個規則.
          先後在一個表中的一個列中創建多個約束,看一下一個列是否可以有多個約束.
2:CHECK約束作爲CREATE TABLE語句的一部分進行指定,而規則必須單獨的創建,然後綁定到列上.

使用規則:
   A:要使規則生效,必須將它與數據庫的某個對象綁定,否則規則毫無用處.
   B:數據庫中的對象只有用戶自定義數據類型和表中的列可以.其它任何對象都不能邦定.
   C:如果對一個表中某個列綁定了規則,則該列必須遵守規則的定義,如果把一個用戶自定義類型綁定了規則,則所有引用該類型的列將都受規則約束.

     1:使用企業管理器讓規則與用戶自定義數據類型和表中的某個列綁定
     2:使用sql語句[sp_bindrule 規則名,/'表名.列名/']
       比如:sp_bindrule sex ,/'work.性別/' [讓work的性別列與規則sex綁定]
       說明:1:可以直接使用sp_bindrule將某個規則應用到一個列上,如果該列原先綁定了一個規則,則新的規則會覆蓋原來的規則       
              [證明在一個列上只能綁定一個規則]
            2:規則不應用於已經存在的該列中的數據,只有當用戶修改列數據時規則纔會生效
            3:一個規則可以綁定一個表的多列或者綁定到多個表的列.
            4:如果該列已經使用了check約束,則所有的約束條件都會被應用.
            5:規則不能綁定到text,image,datatime等類型數據
   
解除綁定
當我們不需要對一個列應用綁定時,可以爲該列解除綁定,注意並不是刪除規則.
  格式:sp_unbindrule 表名.列名|用戶自定義類型名
值得注意的是解除綁定時不需要指明規則名.

通過企業管理器
1:查看相關性,來查看該規則被那些表中的哪些列綁定了.
2:屬性

刪除規則:
說明:要刪除某個規則,必須確保該規則不與任何列綁定否則拒絕刪除.
格式:drop rule 規則名

通過企業管理器來刪除規則

I:使用默認值(default)
  當用戶不輸入值時,可以給某個列指定一個默認值.默認值的性質與規則很相似,也需要綁定.(與創建表時的默認值比較一下)
創建默認值:1:企業管理器
          2:sql語句:create default 列名 as 數據類型常量
比如:create default sex as /'男/'

綁定默認值:
1:企業管理器
2:sql語句:sp_bindefault 列名,/'表名.列名/'|用戶自定義數據類型
   比如:sp_bindefault sex /'work.性別/'
   與規則一樣:1:一個默認值可以綁定一個表的多列或者綁定到多個表的列.
             2:可以直接使用sp_bindefault將某個默認值應用到一個列上,如果該列原先綁定了一個默認值,則新的默認值會覆蓋原來的默認值[證明在一個列上只能創建一個默認值]
             3:如果默認值與規則發生衝突,在輸入時默認值爲失效.  
   比如:work.age的[規則要求>30]而[默認值要求30]試驗一下:
     4:默認值必須與綁定的列是相同的字段類型,否則插入時會出錯
       比如:默認值爲/'a/'而把它綁定到一個整型類型的列上
     5:如果把一個用戶自定義類型綁定了默認值,則所有引用該類型的列將都有默認值.
  
解除默認值的綁定:sp_unbindefault 表名.列名|用戶自定義數據類型
  
刪除默認值:drop default 列名
           說明:與規則一樣,當要刪除的默認值與某個列綁定時,則不能被刪除.

J:使用identity[自動編號]
使用identity特性來定義一個列,標識identity屬性的列,不必在插入新行時爲其賦值,因爲sql server會自動爲設置爲indentity的列設置一個唯一的行序號

創建identity[一般在創建表時指定]
  例如:create table work
       (職工編號 int identity,
        姓名 char(10),
        ....)
  說明:1:在每個表裏最多只能有一個identity列,而且該列不允許爲空.
       2:只有數據類型含有(int)的列可以被設置成爲identity列.
       3:默認情況下,identity的開始值爲1,以1增量值,當然也可以設置開始值和遞增值.
       4:設置開始值和增量值的方式是在括號裏面寫入開始值和增量值.
         例如:create table test
              (列名 int identity(3,2))  [開始值爲3,遞增值爲2]
       5:當表中含有identity的列時,可以用關鍵字identitycol來引用該列
         例如:select identitycol from work
       6:在一般情況下,不允許人爲向identity列插入值

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章