隨筆-28  評論-15  文章-81  trackbacks-0
           

          定義數據表

          假如某個電腦生產商,它的數據庫中保存著整機和配件的產品信息。用來保存整機產品信息的表叫做pc;用來保存配件供貨信息的表叫做parts

          pc表中有一個字段,用來描述這款電腦所使用的CPU型號;在parts表中相應有一個字段,描述的正是CPU的型號,我們可以把它想成是全部CPU的型號列表。

          很顯然,這個廠家生產的電腦,其使用的CPU一定是供貨信息表(parts)中存在的型號。這時,兩個表中就存在一種約束關系(constraint)——pc表中的CPU型號受到parts表中型號的約束。

          首先我們來創建parts表:

          CREATE TABLE parts (

          ...
          字段定義 ...,

          model VARCHAR(20) NOT NULL,

          ... 字段定義 ...

          );

          接下來是PC表:

          CREATE TABLE pc (

          ...
          字段定義 ...,

          cpumodel VARCHAR(20) NOT NULL,

          ... 字段定義 ...

          };

          設置索引

          若要設置外鍵,在參照表 (referencing table,即pc) 和被參照表(referenced table,即parts)中,相對應的兩個字段必須都設置索引(index)

          parts表:

          ALTER TABLE parts ADD INDEX idx_model (model);

          這句話的意思是,為parts表增加一個索引,索引建立在model字段上,給這個索引起個名字叫idx_model

          pc表也類似:

          ALTER TABLE pc ADD INDEX idx_cpumodel (cpumodel);

          事實上這兩個索引可以在創建表的時候就設置。這里只是為了突出其必要性。

          定義外鍵

          下面為兩張表之間建立前面所述的那種約束。因為pcCPU型號必須參照parts表中的相應型號,所以我們將pc表的cpumodel字段設置為外鍵”(FOREIGN KEY),即這個鍵的參照值來自于其他表。

          ALTER TABLE pc ADD CONSTRAINT fk_cpu_model

          FOREIGN KEY (cpumodel)

          REFERENCES parts(model);

          第一行是說要為pc表設置外鍵,給這個外鍵起一個名字叫做fk_cpu_model;第二行是說將本表的cpumodel字段設置為外鍵;第三行是說這個外鍵受到的約束來自于parts表的model字段。

          這樣,我們的外鍵就搞好了!如果我們試著CREATE一臺pc,它所使用的CPU的型號是parts 表中不存在的,那么MySQL會禁止這臺PCCREATE出來。

          級聯操作

          考慮以下這種情況:

          技術人員發現,一個月之前輸入到parts表中的某個系列的cpu(可能有很多款)的型號全都輸錯了一個字母,現在需要改正。我們希望的是,當parts表中那些 Referenced Column 有所變化時,相應表中的 Referencing Column 也能自動更正。

          可以在定義外鍵的時候,在最后加入這樣的關鍵字:

          ON UPDATE CASCADE;

          即在主表更新時,子表(們)產生連鎖更新動作,似乎有些人喜歡把這個叫級聯操作。

          如果把這語句完整的寫出來,就是:

          ALTER TABLE pc ADD CONSTRAINT fk_cpu_model

          FOREIGN KEY (cpumodel)

          REFERENCES parts(model)

          ON UPDATE CASCADE;

          除了CASCADE外,還有RESTRICT(禁止主表變更)SET NULL

          posted on 2007-10-18 03:21 譚明 閱讀(333) 評論(0)  編輯  收藏 所屬分類: MySQL

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 泸定县| 晋州市| 凤台县| 子洲县| 林西县| 长岛县| 华池县| 孟连| 沙田区| 新和县| 陕西省| 张掖市| 霍州市| 门源| 南漳县| 锦州市| 景泰县| 玉林市| 贵溪市| 延长县| 抚松县| 清远市| 遵化市| 沂南县| 宜君县| 禄劝| 扎兰屯市| 新乡县| 邛崃市| 乃东县| 轮台县| 汉阴县| 乌什县| 韩城市| 江孜县| 崇阳县| 顺昌县| 晋中市| 两当县| 商水县| 大丰市|