qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

          約束與數(shù)據(jù)庫對象規(guī)則、默認(rèn)值的探究

            約束、規(guī)則、默認(rèn)值這三者在數(shù)據(jù)表中規(guī)定了數(shù)據(jù)進(jìn)行操作時的限制條件。他們?nèi)哂嘘P(guān)系也有區(qū)別,用了兩天的時間研究了他們?nèi)撸偨Y(jié)如下。

            首先讓我們從關(guān)系角度來分析:

            ● 淺談約束、規(guī)則、默認(rèn)值

            1、約束,約束顧名思義是限制條件的意思,其實它的作用也是如此,它是對所要進(jìn)行增刪改查操作的數(shù)據(jù)進(jìn)行一次檢查,檢查這些數(shù)據(jù)是否符合我們所要約束的條件。舉個例子:我們都經(jīng)歷過高考,考試規(guī)定考生不許帶與考試無關(guān)的物品這就是一種約束。報名考試的考生可能因為某些意外沒有進(jìn)入考場考試,但大部分考生還是進(jìn)行了考試。那么在考場內(nèi)就產(chǎn)生了兩種情況空位和非空位,這就是我們約束條件的兩種情況。我們繼續(xù)分析,在考生進(jìn)入考場的情況中,考生在答卷之前是必須要在試卷和答題卡上填寫自己的信息的,這些信息都是必須要填的因為它們唯一確定了一個考生,這里考生必須填寫考生信息也就是我們所說的主鍵約束(主關(guān)鍵字約束)。接下來我們用兩個表來說明下外鍵約束:

            那么如果我們在字段后面用Not Null規(guī)定了呢?也就是說在我們的考生信息表中的性別字段,該列是不允許為空的于是就用Not Null標(biāo)識,但是如果我們不填的話呢,我們的系統(tǒng)就會用Default默認(rèn)值約束來幫助我們天上一個值。接下來我們來看Check約束,該約束是要用條件表達(dá)式來限定所要填的數(shù)據(jù)的,如下:

                   Create table 工資 (

                            name  char(10) primary key,

                            department  char(20) Not Null,

                            salary int not null check(salary>1000 and salary<4000)

                   )

            創(chuàng)建了一個表該表中有三個字段,name、department、salary,并在salary字段設(shè)置了約束條件。該表如下圖:




           在表中填數(shù)據(jù)時后兩個不符合條件是不正確的。

            在約束中還分為兩種:字段級約束和表級約束。字段級約束是只約束其中的一列,表級約束是約束多列,它們兩個的區(qū)別并不大,我們在理解時可以將表級理解為字段級,即:被約束的多列可以看做捆綁成一列,被捆綁后的字段中的兩個記錄是不能重復(fù)的,如:

            2、規(guī)則,規(guī)則顧名思義是規(guī)矩制度的意思,在進(jìn)行表操作時它的作用和check約束條件是類似的,但是一個表中只有一個規(guī)則,可有多個check約束,如:

               Create table 薪水(

                      name  char(10) primary key,

                      position  char(20) Not Null,

                      salary int not null

                   )

               Create rule ru_salary

               As @salary>1000 and @salary<4000

               Go

               Exec sp_bindrule ‘ru_salary’,  ’薪水.salary’

                 Go

            表說明如下:




            3、默認(rèn)值,用法同規(guī)則,它的作用類似于Default約束,是說在表中插入數(shù)據(jù)時,如果沒有指定值,默認(rèn)值自動指定數(shù)據(jù)值。

            接下來我們在語法上分析三者,看圖:

            1、約束,創(chuàng)建方法大致有三種:

            ——方法一:在創(chuàng)建表時用字句的方式創(chuàng)建約束

           CREATE TABLE 表名(

                      列名數(shù)據(jù)類型,

                      ……

                     <SPAN style="COLOR: #009900"> CONSTRAINT 約束名 PRIMARY KEY (列名),                       ——主鍵約束

                      CONSTRAINT 約束名 UNIQUE (列名),                            ——唯一約束

                      CONSTRAINT 約束名 FOREIGN KEY (列名) REFERENCES 表名 (列名),  ——外鍵約束

                      CONSTRAINT 約束名 CHECK (檢查條件)                           ——Check約束

          </SPAN> );

                  ——方法二:在創(chuàng)建表時直接定義約束

           CREATE TABLE 表名(

           <SPAN style="COLOR: #009900">           列名數(shù)據(jù)類型 NOT NULL,                                        ——非空約束

                      列名數(shù)據(jù)類型 NOT NULL PRIMARY KEY,                            ——主鍵約束

                      列名數(shù)據(jù)類型 NOT NULL UNIQUE,                                 ——唯一約束

                      列名數(shù)據(jù)類型 [NOT NULL] REFERENCES 表名(列名),                ——外鍵約束

                      列名數(shù)據(jù)類型 [NOT NULL] CHECK (檢查條件)                         ——Check約束</SPAN>

           )

                 ——方法三:在創(chuàng)建表后,通過更改表來定義

          <SPAN style="COLOR: #009900"> ALTER TABLE 表名 ALTER COLUMN 列名 SET NOT NULL;

           ALTER TABLE 表名 ADD PRIMARY KEY (列名1,列名2…);

           ALTER TABLE 表名 ADD UNIQUE (列名1,列名2,……);

           ALTER TABLE 表名 ADD FOREIGN KEY(列名) REFERENCES 表名2 (列名2);

           ALTER TABLE 表名 ADD CHECK (檢查條件);
          </SPAN>

            刪除約束的語法為:ALTER TABLE 表名 DROP CONSTRAINT 約束名

            2、規(guī)則。規(guī)則的應(yīng)用操作,首先要創(chuàng)建但只創(chuàng)建是不能應(yīng)用的要用sp_bindrule將規(guī)則綁定到字段或自定義的數(shù)據(jù)類型上才能起作用。

             ——創(chuàng)建

           <SPAN style="COLOR: #009900">   Create rule 規(guī)則名 as 條件表達(dá)式
          </SPAN>
              ——綁定

             <SPAN style="COLOR: #009900"> Exec sp_bindrule ‘規(guī)則名’  , ‘表名.字段名’ | ‘數(shù)據(jù)類型’

          </SPAN>    ——解除綁定

            <SPAN style="COLOR: #009900">  sp_unbindrule  ‘表名.字段名’ | ‘數(shù)據(jù)類型’
          </SPAN>
              ——刪除規(guī)則

              <SPAN style="COLOR: #009900">DROP RULE {rule_name} [,...n]
          </SPAN>

            3、默認(rèn)值的語法和規(guī)則是類似的,只需將規(guī)則中的rule改成關(guān)鍵字default即可。

            三者間的關(guān)系很清楚了吧。


          posted on 2012-08-10 09:36 順其自然EVO 閱讀(200) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

          <2012年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 武平县| 新竹市| 平昌县| 绩溪县| 建宁县| 公主岭市| 通化县| 治县。| 门源| 宜春市| 内江市| 梁平县| 赫章县| 科技| 双城市| 卓资县| 临海市| 大安市| 双江| 罗定市| 分宜县| 健康| 万山特区| 文安县| 增城市| 霍州市| 潼南县| 交城县| 福贡县| 张北县| 孟州市| 兰坪| 绥芬河市| 理塘县| 静海县| 常熟市| 华容县| 长顺县| 马关县| 大姚县| 温泉县|