1. 程式人生 > >簡簡單單說外來鍵和級聯

簡簡單單說外來鍵和級聯

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

文首

        今天給考試系統新增學生資訊失敗,原因是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 [email protected]  --先刪除從表中的資料行
	delete from main where id [email protected]   ---再刪除主表中的資料行
END

總結

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

相關推薦

簡簡單單外來

外來鍵 定義作用主表和從表建鍵原則事件觸發限制外來鍵簡單例項觸發器實現 建表語句關係說明實現級聯刪除更改設定實現總結 文首         今天給考試系統新增學生資訊失敗,原因是student與cl

C#操作資料庫主外來約束

  SqlConnection a = new SqlConnection(str1);                 a.Open();                 SqlCommand conn1 = new SqlCommand("create database

mysql004--關聯查詢,外來操作,常用內建函式

ascii()   --返回字元的sacii碼 char()   --檢視ascii碼對應的字元值 concat(var1,var2,var3)  --字串拼接 length(str)   --返回字元長度 substring(str,start,len) --字串擷取 trim() ltrim()

SQL SERVER 主外來中的 刪除(ON DELETE CASCADE)更新(ON UPDATE CASCADE)

建立學生表 create table gh_student( stuno varchar(3) primary key, stuname varchar(4), stuclass varchar(3) ) 插入資料 insert into gh_student values

29、異常的巢狀

學習目標: 1、瞭解異常的巢狀的語法和作用 2、瞭解級聯捕獲異常的意義和語法   學習過程: 這節我們需要探討的問題是,如果我們需要try嘗試捕獲的異常不止一個,那麼我們需要如何處理呢? 一、分開捕獲或者巢狀使用 我們先看看下面這段程式碼:

複習電商筆記-18-商品描述程式碼實現刪除

    *MySQL獲取剛插入的自增長id的值 INSERT INTO TB_USER (id,username) VALUE(NULL,'a'); SELECT LAST_INSERT_ID(); #內部加鎖實現,所以不會有併發的執行緒安全問題  

MySQL刪除修改

1、新建主鍵table 1 create table demo1_zhujian ( 2 id int primary key auto_increment, 3 name varchar(10)); 2、新建外來鍵table 1 create table demo2_waij

欄位欄位的引數,查詢的13個方法,但標的雙下劃線外來多對多操作

                欄位  常用欄位  AutoField() 自增列,必須填入引數 primary_key=True則成為資料庫的主鍵。無該欄位時,django自動建立 一個model不能有兩個AutoField欄位。 IntegerField() 一個整數

Hibernate(5.3.7)關聯關係中的反轉

1、反轉: 反轉操作在對映檔案中通過對集合的inverse屬性設定,來控制關聯關係和物件的級聯關係。 inverse預設為false,關係的兩端都能夠控制,但會造成更新時出現重複更新的情況,產生多餘的SQL語句。所以在實際開發中,一對多的時候,將一的一方inverse設定為true,

MySQL資料庫基礎知識四(外來引用)

級聯刪除,級聯更新 外來鍵維護資料的一致性。 下面是幾條術語: 父表:包含原始鍵值的表。 子表:引用了父表中鍵值的相關表。 建立父表和子表關聯案例 父表: create table parent { par_id INT NOT NULL, PRIMAR

OpenCV中基於Haar特徵分類器的人臉檢測(三)

使用機器學習的方法進行人臉檢測的第一步需要訓練人臉分類器,這是一個耗時耗力的過程,需要收集大量的正負樣本,並且樣本質量的好壞對結果影響巨大,如果樣本沒有處理好,再優秀的機器學習分類演算法都是零。 今年3月23日,微軟公司在推特(Twitter)社交平臺上推出了一個基於機

hiberbate一對多的新增查詢與刪除

1. 什麼是關聯(association) 1.1 關聯指的是類之間的引用關係。如果類A與類B關聯,那麼被引用的類B將被定義為類A的屬性。例如: public class A{ private B b = new B; public A(){} } 1.2 關聯

【MySQL技術內幕】39-外來

外來鍵主要用於引用完整性的約束檢查。在 InnoDB儲存引擎中,對於一個外來鍵列,如果沒有顯式地對這個列加索引, InnoDB儲存引擎自動對其加一個索引,因為這樣可以避免表鎖——這比 Oracle資料庫做得好, Oracle資料庫不會自動新增索引,使用者必須自已手動新增,這也

hibernate的多對多(02)刪除(06)

資料庫的多對多 1.1 資料庫中不能直接對映多對多 處理:建立一個橋接表(中間表),將一個多對多關係轉換成兩個一對多 注1:資料庫多表聯接查詢 永遠就是二個表的聯接查詢 A B C D t1 C t

資料庫MySQL之如何新增主、唯一、外來預設約束?

如何新增主鍵、唯一、外來鍵和預設約束? 文章目錄 如何新增主鍵、唯一、外來鍵和預設約束? 1. 新增主鍵約束 2. 新增唯一約束 3. 新增外來鍵約束 4. 新增/刪除預設約束 DEFAULT

《連載 | 物聯網框架ServerSuperIO教程》- 11.實現裝置(驅動)與裝置(驅動)互動控制。注:裝置驅動模擬金三與普京的對話

目       錄 11.實現裝置(驅動)與裝置(驅動)級聯控制... 2 11.1         概述... 2 11.2         裝置連結器... 2 11.3         場景假設... 3 11.4         裝置驅動開

對Hibernate中關係維護方的理解

級聯:在雙向多對一中,有一方設定了級聯,如@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)(它是在多的一方設定了級聯),它的作用就是在操作設定級聯的那一方時會影響另一方(比如在儲存時,當然前提是要對對

關於資料庫的外來

轉自:http://blog.csdn.net/championhengyi/article/details/78559789什麼是主鍵、外來鍵關係型資料庫中的一條記錄中有若干個屬性,若其中某一個屬性組(注意是組)能唯一標識一條記錄,該屬性組就可以成為一個主鍵。比如:學生表(

對Sql Server中的表新增更新刪除的幾種方法

觸發器方式:create trigger trg_Aon Afor update,deleteasbeginif exists(select 1 from inserted)update B set Name=(select Name from inserted) where

pg資料庫多表查詢(inner)查詢

一、資料庫的多表連線查詢,inner的不同用法在pg資料庫中建立兩張表:t_a和t_b如下所示:t_a:t_b:1、inner join(內連線)inner join就是根據on欄位標示出來的條件,查詢關聯的表中符合條件的資料,並把他前部都顯示出來,形成一個結果集。執行如下語