mysql外來鍵的使用

2021-05-10 22:00:15 字數 4381 閱讀 2048

像mysql這樣的關係型資料庫管理系統,它們的基礎是在資料庫的表之間建立關係的能力。通過方便地在不同表中建立記錄到記錄的聯絡,rdbms可以利用不同的方法分析資料,同時保持資料庫以系統的方式、最小的冗餘進行組織。

簡單描述:

這些關係基本上依靠外來鍵進行管理,在關係中所有表中具有相同含義的字段作為公共部分來連線不同表中的記錄。外來鍵可以是一對一的,乙個表的記錄只能與另乙個表的一條記錄連線,或者是一對多的,乙個表的記錄與另乙個表的多條記錄連線。

mysql中「鍵」和「索引」的定義相同, 所以外來鍵和主鍵一樣也是索引的一種。不同的是mysql會自動為所有表的主鍵進行索引,但是外來鍵字段必須由使用者進行明確的索引。這和一些封建思想比較沉重的家庭是一樣的,外來的孩子(兒媳婦,倒插門女婿)一般都是不受重視的。

低俗示例:

表間一對一關係示例:

有兩張表,第一張表是記錄公司有多少人,都有誰,也就是員工編號及員工姓名這些基本表。另一張表記錄每個月發給使用者多少工資,所謂工資表是也。

但是工資表裡面不能以員工姓名為主鍵,同樣要通過員工id,因為員工的姓名是可能重複的啊。部門經理叫張三,小弟也叫張三,那這倆張三的工資能一樣嗎?並且員工表裡面的每個人都有工資,否則誰也不給你幹活,且乙個人只能有乙份工資,否則老闆也不同意了。所以員工表和工資表是通過員工id進行關聯的一對一關係

不過我們要有乙個好的價值觀,我們上班不能為了錢,我們是為了學知識,學文化,為早日實現四個現代化(別問我是啥,也別問我到底實現沒有)而努力奮鬥。所以在工資表裡如果沒有你也不要亂喊。嗯。

/*建立員工表

*/ create

table

employees

(id

int(5

)not

null

auto_increment

,name

varchar

(8)not

null

,primary key

(id))

type

= innodb

;/*建立工資表

*/ create

table

payroll

(id

int(5

)not

null

,emp_id

int(5

)not

null

,name

varchar

(8)not

null

,payroll

float

(4,2

)not

null

,primary key

(id),

index

emp_id

(emp_id

),foreign key

(emp_id

)references

employees

(id))

type

=innodb

; 表間一對多關係示例:

有兩個表,乙個是**表,有**的id和名字。另有一張****表,注意乙個**不一定只有乙個**,其有個二三四五奶是很正常的,所以在**表裡面的一條資料,對應**表裡可能就有多條記錄,這是通過**id進行關聯的一對多關係

參照完整性:

當外來鍵與另乙個表的字段有關係,而且這種關係是惟一時,這個系統就稱為處於參照完整性的狀態。也就是說,如果乙個欄位在所有的表中只出現一次,而且每個表的這個欄位的變化都會影響其他表,這就是存在參照完整性。

術語理解上可能不太方便,其實就是說要在有外來鍵的表中保持所有資料的一致性。比如說「張三」離職了,在員工表裡面肯定沒有這個人了,可是如果在工資表裡面還存在這個孩子,那麼老大就會很生氣的

另外,比如說乙個縣官,因為一些小政績,由縣官變成了知府,那麼他的那些**的地位也要調整一下,最起碼得從縣官二奶改為知府二奶,否則這位二奶也是不會同意的

mysql的外來鍵只能在innodb表中使用:

當今主流資料庫都會自動考慮參照完整性的問題。當你更新或刪除資料時,其會把相關聯的表中資料也都給你變過來。比如縣官張三改名為王二麻子,其**的稱號就會自動改為王二麻子的**。嗯。

mysql對此一直持觀望態度,它允許使用外來鍵,但是為了完整性檢驗的目的,在除了innodb表型別之外的所有表型別中都忽略了這個功能。這可能有些怪異,實際上卻非常正常:對於資料庫的所有外來鍵的每次插入、更新和刪除後,進行完整性檢查是乙個耗費時間和資源的過程,它可能影響效能,特別是當處理複雜的或者是纏繞的連線樹時。因而,使用者可以在表的基礎上,選擇適合於特定需求的最好結合。

所以,如果需要更好的效能,並且不需要完整性檢查,可以選擇使用myisam表型別,如果想要在mysql中根據參照完整性來建立表並且希望在此基礎上保持良好的效能,最好選擇表結構為innodb型別。

mysql建立外來鍵語法:

建立外來鍵的語法是這樣的:foreign key (當前表的欄位名)… references 參照表 (參照表的欄位名)

foreign key (emp_id) references employees (id); 的意思就是說當前表的emp_id欄位是以employees的id欄位為外來鍵的。

注意事項:

刪除外來鍵方法:

long long ago,人們只能通過刪除表來刪除外來鍵。不過現在mysql(在4.0.13及更高版本中)提供了一種從表中刪除外來鍵比較緩和的方法,緩和與否不太清楚,但是至少不再那麼無恥。

alter table table-name drop foreign key key-id;

這裡有乙個概念,這個外來鍵的id是啥玩意?我們可以通過show create table 命令來獲得key-id的值。日後我們詳細討論這些內容,大家可以自行演示。

/*顯示建表結構語句,key-id為payroll_ibfk_1

*/ show

create

table

payroll /g

/**************************** 1. row ***************************

table: payroll

create table: create table `payroll` (

`id` int(5) not null,

`emp_id` int(5) not null,

`name` varchar(8) not null,

`payroll` float(4,2) not null,

primary key (`id`),

key `emp_id` (`emp_id`),

constraint `payroll_ibfk_1` foreign key (`emp_id`) references `employees` (`id`)

) engine=innodb default charset=latin1

1 row in set (0.00 sec)*/

自動鍵更新和刪除:

外來鍵可以保證新插入的記錄的完整性。但是,如果在references從句中從已命名的表刪除記錄會怎樣?在使用同樣的值作為外來鍵的輔助表中會發生什麼?

很明顯,那些記錄也應該被刪除,否則在資料庫中就會有很多無意義的孤立記錄。mysql可能通過向foreign key…references 修飾符新增乙個on delete或on update子句簡化任務,它告訴了資料庫在這種情況如何處理孤立任務。

關鍵字含義

cascade

刪除包含與已刪除鍵值有參照關係的所有記錄

set null

修改包含與已刪除鍵值有參照關係的所有記錄,使用null值替換(只能用於已標記為not null的字段)

restrict

拒絕刪除要求,直到使用刪除鍵值的輔助表被手工刪除,並且沒有參照時(這是預設設定,也是最安全的設定)

no action

啥也不做

請注意,通過 on update 和on delete規則,設定mysql能夠實現自動操作時,如果鍵的關係沒有設定好,可能會導致嚴重的資料破壞。例如,如果一系列的表通過外來鍵關係和on delete cascade 規則連線時,任意乙個主表的變化都會導致甚至只和原始刪除有一些將要聯絡的記錄在沒有警告的情況下被刪除。所以,我們在操作之前還是要檢查這些規則的,操作之後還要再次檢查。

MySQL 外來鍵及外來鍵的使用

如果公共關鍵字在乙個關係中是主關鍵字,那麼這個公共關鍵字被稱為另乙個關係的外來鍵。由此可見,外來鍵表示了兩個關係之間的相關聯絡。以另乙個關係的外來鍵作主關鍵字的表被稱為主表,具有此外鍵的表被稱為主表的從表。外來鍵又稱作外關鍵字。表間關係有一對一,一對多和多對多。首先我們舉個簡單的栗子 學生表,老師表...

mysql外來鍵教程 MySQL外來鍵使用詳解

最近有開始做乙個實驗室管理系統,因為分了幾個表進行儲存 所以要維護表間的關聯 研究了一下mysql的外來鍵 1 只有innodb型別的表才可以使用外來鍵,mysql預設是myisam,這種型別不支援外來鍵約束 2 外來鍵的好處 可以使得兩張表關聯,保證資料的一致性和實現一些級聯操作 3 外來鍵的作用...

mysql是否推薦使用外來鍵 MySQL 外來鍵使用

mysql 外來鍵使用 外來鍵的使用條件 1.兩個表必須是innodb表,myisam表暫時不支援外來鍵 據說以後的版本有可能支援,但至少目前不支援 2.外來鍵列必須建立了索引,mysql 4.1.2以後的版本在建立外來鍵時會自動建立索引,但如果在較早的版本則需要顯示建立 3.外來鍵關係的兩個表的列...