qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          約束與數據庫對象規則、默認值的探究

            約束、規則、默認值這三者在數據表中規定了數據進行操作時的限制條件。他們三者有關系也有區別,用了兩天的時間研究了他們三者,總結如下。

            首先讓我們從關系角度來分析:

            ● 淺談約束、規則、默認值

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

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

                   Create table 工資 (

                            name  char(10) primary key,

                            department  char(20) Not Null,

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

                   )

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




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

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

            2、規則,規則顧名思義是規矩制度的意思,在進行表操作時它的作用和check約束條件是類似的,但是一個表中只有一個規則,可有多個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、默認值,用法同規則,它的作用類似于Default約束,是說在表中插入數據時,如果沒有指定值,默認值自動指定數據值。

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

            1、約束,創建方法大致有三種:

            ——方法一:在創建表時用字句的方式創建約束

           CREATE TABLE 表名(

                      列名數據類型,

                      ……

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

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

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

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

          </SPAN> );

                  ——方法二:在創建表時直接定義約束

           CREATE TABLE 表名(

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

                      列名數據類型 NOT NULL PRIMARY KEY,                            ——主鍵約束

                      列名數據類型 NOT NULL UNIQUE,                                 ——唯一約束

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

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

           )

                 ——方法三:在創建表后,通過更改表來定義

          <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、規則。規則的應用操作,首先要創建但只創建是不能應用的要用sp_bindrule將規則綁定到字段或自定義的數據類型上才能起作用。

             ——創建

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

             <SPAN style="COLOR: #009900"> Exec sp_bindrule ‘規則名’  , ‘表名.字段名’ | ‘數據類型’

          </SPAN>    ——解除綁定

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

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

            3、默認值的語法和規則是類似的,只需將規則中的rule改成關鍵字default即可。

            三者間的關系很清楚了吧。


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

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

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 平塘县| 新津县| 高州市| 邯郸市| 科技| 库伦旗| 南投市| 上饶市| 潮州市| 璧山县| 台安县| 高密市| 夏津县| 兴山县| 平顶山市| 沾益县| 紫金县| 施甸县| 资中县| 全南县| 承德市| 金沙县| 壤塘县| 射阳县| 平遥县| 江口县| 灯塔市| 成都市| 门头沟区| 清镇市| 邵武市| 共和县| 嘉定区| 玉林市| 平定县| 南靖县| 芦溪县| 合作市| 武清区| 通河县| 沁阳市|