qileilove

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

          簡簡單單說外鍵和級聯

           ● 外鍵
              ○ 定義
              ○ 作用
              ○ 主表和從表
              ○ 建鍵原則
              ○ 事件觸發限制

            ● 外鍵簡單實例

            ● 觸發器實現
              ○ 建表語句
              ○ 關系說明
              ○ 實現級聯刪除

            ● 更改設置實現

            ● 總結

            文首

            今天給考試系統添加學生信息失敗,原因是student與classes表有級聯關系,作為從表的student表不能隨意添加,這些都學過卻還沒怎么用過,借這次機會學習一下。

            外鍵

            說到級聯刪除不得不先說一下外鍵,外鍵的定義:“如果公共關鍵字在一個關系中是主關鍵字,那么這個公共關鍵字被稱為另一個關系的外鍵;換而言之,如果關系模式R中的某屬性集不是R的主鍵,而是另一個關系R1的主鍵則該屬性集是關系模式R的外鍵”。

            建立外鍵的sql語句:

          foreign key(idB) references A(idA)

            從語法分析也可以看出:外鍵是一種表之間字段值的引用關系。

            主表和從表

            主表和從表:以另一個關系的外鍵作主關鍵字的表被稱為從表,具有此外鍵的表被稱為主表。說白了就是:主表是被引用的表,外表是引用其他表的表。

            那么外鍵有什么作用?外鍵作用可以說是:保持數據一致性,完整性,關聯性,主要目的是控制存儲在外鍵表中的數據。就是當你對一個表的數據進行操作,和他有關聯的一個或更多表的數據能夠同時發生改變,避免無效或是無用的改變和孤立的數據。

            建鍵原則:

            1、外鍵字段為主鍵

            2、所有的鍵都必須唯一

            3、避免使用復合鍵

            4、外鍵總是關聯唯一的鍵字段

            外鍵約束事件觸發。既然有外鍵約束,當違反約束時會發生什么?我們把它的反應看作事件,一共有四種:

            1、級聯:當主表更改時,從表跟從更改。

            2、不執行任何操作。

            3、設置null。

            4、設置默認值。

            我的看法

            這些聽著挺玄,我說說自己的看法:主表、從表和外鍵的定義:我把我的筆記本借給你用,可以把“我”當作是主表、“筆記本”當作外鍵、“你”當作從表,就是說“你”在使用(引用)“我”的“筆記本”;外鍵的作用就是:現在你想把我的筆記本賣了扔了送人(增加更新刪除等),得看看我允許不允許,我想搬家走人,你不把筆記本還給我,我不能搬;建鍵原則:借之前首先咱得說好了,我只有這么一臺筆記本,你也最好是也只借了我這臺筆記本,避免你也借了別人的筆記本,不知道哪個是我的了。事件觸發:我說你趕緊把筆記本還給我,你可以選擇還給我,可以選擇不搭理我等。總而言之,由于這筆記本,“你”和“我”關聯起來,這臺筆記本怎么樣,不能一個人說了算。

          簡單實例

            說了這么多,咱先說個簡單的實例:建立兩個表t_main和t_branch,并設置外鍵。語句的意思是t_main中的id是t_branch 的外鍵。

          create table t_main
          (
            id int primary key,
            [content] varchar(100) not null
           
          )
          create table t_branch
          (
           mainId int Primary key ,
           [content] varchar(100) not null,
           foreign key(mainId) references t_main(id)
          )

            執行語句,現在我想直接在t_branch中插入一條數據insert into t_branch values(3,'分支表'),提示如下:INSERT 語句與 FOREIGN KEY 約束"FK__t_branch__mainId__4F7CD00D"沖突。該沖突發生于數據庫"beidaqingniao",表"dbo.t_main", column 'id'。

            我想刪除t_main語句drop table t_main,提示如下:無法刪除對象 't_main',因為該對象正由一個 FOREIGN KEY 約束引用。

            在這兩個表中,該外鍵的作用是,t_main中沒有的外鍵值t_branch不能插入,而t_branch 正在引用t_main所以也不能只先刪除t_main,否則t_branch中的數據會被孤立。我覺得,外鍵對主表的作用更傾向于不能刪除,而對從表的作用更傾向于不能隨便添加。

            級聯刪除

            但是如果想級聯刪除怎么辦?總結出三種辦法。

            sql語句修改設置:因為默認的外鍵觸發是“不執行任何操作”,所以我們可以使用sql語句更改設置:

          FOREIGN KEY(id)REFERENCES tabley(id) on delete cascade on update cascade

            意思是從表會跟隨主表的改變而改變。

            可視化修改:不想寫代碼,也可以可視化操作,新建數據庫關系圖,選擇主表和從表添加,其關系也會自動添加。選擇主表或從表---右鍵---關系---insert和update規范---級聯。如圖:

            當然也可以使用觸發器,觸發器的基礎知識,歡迎訪問我的博客《詳解sql中的觸發器

          -- =============================================
          -- Author:  李達 
          -- Create date: 2012年6月10日 18:11:46
          -- Description: 簡單的級聯刪除
          -- =============================================
          ALTER TRIGGER [dbo].[trigCascadeDelete]    --觸發器名
             ON  [dbo].[main]      ---作用于哪張表
             instead of  delete    ---什么動作觸發
          AS 
          BEGIN
           declare @id int   --聲明@id變量
           select @id=id from deleted --取出要刪除的id
           delete from branch where mainId =@id  --先刪除從表中的數據行
           delete from main where id =@id   ---再刪除主表中的數據行
          END

            總結

            看過的知識不是你的,學過的知識不一定是你的,只有總結、運用后,才能更好的掌握知識,眼高手低的結果就是紙上談兵。

          posted on 2012-06-15 11:21 順其自然EVO 閱讀(385) 評論(0)  編輯  收藏 所屬分類: 數據庫

          <2012年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 民勤县| 陇南市| 大余县| 洪湖市| 常州市| 自治县| 原平市| 连州市| 加查县| 五大连池市| 抚顺县| 富阳市| 仙居县| 涞源县| 连南| 海兴县| 天津市| 阿鲁科尔沁旗| 基隆市| 台北市| 乌鲁木齐市| 长泰县| 青龙| 济源市| 兰西县| 吉隆县| 讷河市| 汶川县| 霍邱县| 德保县| 乌审旗| 晴隆县| 裕民县| 东平县| 梁平县| 元氏县| 永济市| 东辽县| 抚松县| 乌鲁木齐市| 永泰县|