轉自(簡簡單單說外鍵和級聯 )
- 外鍵
- 定義
- 作用
- 主表和從表
- 建鍵原則
- 事件觸發限制
- 外鍵簡單實例
- 觸發器實現
- 建表語句
- 關系說明
- 實現級聯刪除
- 更改設置實現
- 總結
文首
今天給考試系統添加學生信息失敗,原因是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
總結
看過的知識不是你的,學過的知識不一定是你的,只有總結、運用后,才能更好的掌握知識,眼高手低的結果就是紙上談兵。
轉自(數據庫 外鍵 )
外鍵是什么?
外鍵 (FK) 是用於建立和加強兩個表數據之間的鏈接的一列或多列。通過將保存表中主鍵值的一列或多列添加到另一個表中,可創建兩個表之間的鏈接。這個列就成為第二個表的外鍵。
外鍵數據庫一級的完整性約束,由數據庫自行維護.你也可以手動建立.
1如果存在外鍵關系的話,任何修改主表主鍵字段和刪除主表行的行為,都是不可執行的.
2如果存在外鍵,,那么有外鍵的表的字段,會隨着主表的更新而更新.
3.可以使用級聯刪除.
你建了兩張表
Student_info和Student_numeric
學生信息表和學生成績表
現在說如果有個學生不讀書 了 我們就肯定要在學生信息表里刪除這個學生的信息,在學生信息表里面,包括他的 ID , Name , Adderss 等的信息,就是說在學生信息表里面刪除這個學生,那么在學生成績表里面呢,這個學生不存在了,在學生成績表里面還有這個學生的成績,肯定是不行的,肯定要 級聯的刪除了,這里就要用到級聯刪除了,否則就說不過去了
4.如果一個字段是外鍵的話,他必須來自於主表中的某一條數據,否則的話他必須為空.
從而防止錯誤數據的錄入.
如果你不希望使用外鍵,你可以隨時刪除外鍵.