<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(384) 評論(0)  編輯  收藏 所屬分類: 數據庫

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

    導航

    統計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产亚洲精品91| 国产免费久久精品99久久| 1000部夫妻午夜免费| 国产V亚洲V天堂无码| 黄色免费在线网站| 亚洲国产成人高清在线观看| 在线观看特色大片免费网站| AV无码免费永久在线观看| 亚洲第一成年人网站| 99久久久国产精品免费无卡顿 | 亚洲高清成人一区二区三区| 亚洲中久无码永久在线观看同| 国产精品福利片免费看| 亚洲中文字幕在线第六区| 热久久这里是精品6免费观看 | 亚洲?v女人的天堂在线观看| 狠狠色伊人亚洲综合成人| 久久久久久噜噜精品免费直播| 亚洲产国偷V产偷V自拍色戒| 麻豆视频免费观看| 亚洲狠狠婷婷综合久久蜜芽| 五月天婷亚洲天综合网精品偷| 99视频在线观看免费| 亚洲高清在线mv| 麻豆国产人免费人成免费视频| 色多多A级毛片免费看| 久久精品亚洲综合专区| 久久WWW色情成人免费观看| 亚洲色成人网一二三区| 成年女人看片免费视频播放器 | 免费播放在线日本感人片| 亚洲精品美女久久久久9999| 免费无码又爽又刺激高潮| 国产免费播放一区二区| 亚洲成年人电影网站| 国产亚洲免费的视频看| 精品日韩99亚洲的在线发布| 亚洲人成网站观看在线播放| 人人玩人人添人人澡免费| 亚洲国产日韩精品| 一二三四在线观看免费高清中文在线观看|