● 外鍵
○ 定義
○ 作用
○ 主表和從表
○ 建鍵原則
○ 事件觸發限制
● 外鍵簡單實例
● 觸發器實現
○ 建表語句
○ 關系說明
○ 實現級聯刪除
● 更改設置實現
● 總結
文首
今天給考試系統添加學生信息失敗,原因是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 |
總結
看過的知識不是你的,學過的知識不一定是你的,只有總結、運用后,才能更好的掌握知識,眼高手低的結果就是紙上談兵。