外鍵和級聯

前幾天找了一點關於主鍵和外鍵的資料,還發現了一篇文章,也不錯,是介紹 外鍵和級聯的,原文地址是http://blog.csdn.net/lidaasky/article/details/7645524

  • 外鍵
    • 定義
    • 作用
    • 主表和從表
    • 建鍵原則
    • 事件觸發限制
  • 外鍵簡單實例
  • 觸發器實現
    • 建表語句
    • 關係說明
    • 實現級聯刪除
  • 更改設置實現
  • 總結

文首

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

外鍵

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

        建立外鍵的sql語句:

  1. foreign key(idB) references A(idA)  

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

        主表和從表

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

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

        建鍵原則

       1、 外鍵字段爲主鍵
  2、 所有的鍵都必須唯一
  3、避免使用複合鍵
  4、外鍵總是關聯唯一的鍵字段

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

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

        2、不執行任何操作。

        3、設置null。

        4、設置默認值。

         我的看法

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

簡單實例

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

  1. create table t_main  
  2. (  
  3.      id int primary key,  
  4.      [content] varchar(100) not null  
  5.       
  6. )  
  7. create table t_branch  
  8. (  
  9.     mainId int Primary key ,  
  10.     [content] varchar(100) not null,  
  11.     foreign key(mainId) references t_main(id)  
  12. )  

        執行語句,現在我想直接在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語句更改設置:

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

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

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

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

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

總結

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章