簡簡單單說外鍵和級聯(lián)
● 外鍵
○ 定義
○ 作用
○ 主表和從表
○ 建鍵原則
○ 事件觸發(fā)限制
● 外鍵簡單實例
● 觸發(fā)器實現(xiàn)
○ 建表語句
○ 關(guān)系說明
○ 實現(xiàn)級聯(lián)刪除
● 更改設(shè)置實現(xiàn)
● 總結(jié)
文首
今天給考試系統(tǒng)添加學生信息失敗,原因是student與classes表有級聯(lián)關(guān)系,作為從表的student表不能隨意添加,這些都學過卻還沒怎么用過,借這次機會學習一下。
外鍵
說到級聯(lián)刪除不得不先說一下外鍵,外鍵的定義:“如果公共關(guān)鍵字在一個關(guān)系中是主關(guān)鍵字,那么這個公共關(guān)鍵字被稱為另一個關(guān)系的外鍵;換而言之,如果關(guān)系模式R中的某屬性集不是R的主鍵,而是另一個關(guān)系R1的主鍵則該屬性集是關(guān)系模式R的外鍵”。
建立外鍵的sql語句:
foreign key(idB) references A(idA) |
從語法分析也可以看出:外鍵是一種表之間字段值的引用關(guān)系。
主表和從表
主表和從表:以另一個關(guān)系的外鍵作主關(guān)鍵字的表被稱為從表,具有此外鍵的表被稱為主表。說白了就是:主表是被引用的表,外表是引用其他表的表。
那么外鍵有什么作用?外鍵作用可以說是:保持數(shù)據(jù)一致性,完整性,關(guān)聯(lián)性,主要目的是控制存儲在外鍵表中的數(shù)據(jù)。就是當你對一個表的數(shù)據(jù)進行操作,和他有關(guān)聯(lián)的一個或更多表的數(shù)據(jù)能夠同時發(fā)生改變,避免無效或是無用的改變和孤立的數(shù)據(jù)。
建鍵原則:
1、外鍵字段為主鍵
2、所有的鍵都必須唯一
3、避免使用復合鍵
4、外鍵總是關(guān)聯(lián)唯一的鍵字段
外鍵約束事件觸發(fā)。既然有外鍵約束,當違反約束時會發(fā)生什么?我們把它的反應(yīng)看作事件,一共有四種:
1、級聯(lián):當主表更改時,從表跟從更改。
2、不執(zhí)行任何操作。
3、設(shè)置null。
4、設(shè)置默認值。
我的看法
這些聽著挺玄,我說說自己的看法:主表、從表和外鍵的定義:我把我的筆記本借給你用,可以把“我”當作是主表、“筆記本”當作外鍵、“你”當作從表,就是說“你”在使用(引用)“我”的“筆記本”;外鍵的作用就是:現(xiàn)在你想把我的筆記本賣了扔了送人(增加更新刪除等),得看看我允許不允許,我想搬家走人,你不把筆記本還給我,我不能搬;建鍵原則:借之前首先咱得說好了,我只有這么一臺筆記本,你也最好是也只借了我這臺筆記本,避免你也借了別人的筆記本,不知道哪個是我的了。事件觸發(fā):我說你趕緊把筆記本還給我,你可以選擇還給我,可以選擇不搭理我等。總而言之,由于這筆記本,“你”和“我”關(guān)聯(lián)起來,這臺筆記本怎么樣,不能一個人說了算。
簡單實例
說了這么多,咱先說個簡單的實例:建立兩個表t_main和t_branch,并設(shè)置外鍵。語句的意思是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) ) |
執(zhí)行語句,現(xiàn)在我想直接在t_branch中插入一條數(shù)據(jù)insert into t_branch values(3,'分支表'),提示如下:INSERT 語句與 FOREIGN KEY 約束"FK__t_branch__mainId__4F7CD00D"沖突。該沖突發(fā)生于數(shù)據(jù)庫"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中的數(shù)據(jù)會被孤立。我覺得,外鍵對主表的作用更傾向于不能刪除,而對從表的作用更傾向于不能隨便添加。
級聯(lián)刪除
但是如果想級聯(lián)刪除怎么辦?總結(jié)出三種辦法。
sql語句修改設(shè)置:因為默認的外鍵觸發(fā)是“不執(zhí)行任何操作”,所以我們可以使用sql語句更改設(shè)置:
FOREIGN KEY(id)REFERENCES tabley(id) on delete cascade on update cascade |
意思是從表會跟隨主表的改變而改變。
可視化修改:不想寫代碼,也可以可視化操作,新建數(shù)據(jù)庫關(guān)系圖,選擇主表和從表添加,其關(guān)系也會自動添加。選擇主表或從表---右鍵---關(guān)系---insert和update規(guī)范---級聯(lián)。如圖:
當然也可以使用觸發(fā)器,觸發(fā)器的基礎(chǔ)知識,歡迎訪問我的博客《詳解sql中的觸發(fā)器》
-- ============================================= -- Author: 李達 -- Create date: 2012年6月10日 18:11:46 -- Description: 簡單的級聯(lián)刪除 -- ============================================= ALTER TRIGGER [dbo].[trigCascadeDelete] --觸發(fā)器名 ON [dbo].[main] ---作用于哪張表 instead of delete ---什么動作觸發(fā) AS BEGIN declare @id int --聲明@id變量 select @id=id from deleted --取出要刪除的id delete from branch where mainId =@id --先刪除從表中的數(shù)據(jù)行 delete from main where id =@id ---再刪除主表中的數(shù)據(jù)行 END |
總結(jié)
看過的知識不是你的,學過的知識不一定是你的,只有總結(jié)、運用后,才能更好的掌握知識,眼高手低的結(jié)果就是紙上談兵。
posted on 2012-06-15 11:21 順其自然EVO 閱讀(388) 評論(0) 編輯 收藏 所屬分類: 數(shù)據(jù)庫