MYSQL外來鍵 Foreign Key 的使用

2021-06-11 05:19:34 字數 4512 閱讀 2833

mysql外來鍵(foreign key)的使用

在mysql 3.23.44版本後,innodb引擎型別的表支援了外來鍵約束。

外來鍵的使用條件:

1.兩個表必須是innodb表,myisam表暫時不支援外來鍵(據說以後的版本有可能支援,但至少目前不支援);

2.外來鍵列必須建立了索引,mysql 4.1.2以後的版本在建立外來鍵時會自動建立索引,但如果在較早的版本則需要顯示建立;

3.外來鍵關係的兩個表的列必須是資料型別相似,也就是可以相互轉換型別的列,比如int和tinyint可以,而int和char則不可以;

外來鍵的好處:可以使得兩張表關聯,保證資料的一致性和實現一些級聯操作;

外來鍵的定義語法:

[constraint symbol] foreign key [id] (index_col_name, ...)

references tbl_name (index_col_name, ...)

[on delete ]

[on update ]

該語法可以在 create table 和 alter table 時使用,如果不指定constraint symbol,mysql會自動生成乙個名字。

on delete、on update表示事件觸發限制,可設引數:

restrict(限制外表中的外來鍵改動)

cascade(跟隨外來鍵改動)

set null(設空值)

set default(設預設值)

no action(無動作,預設的)

搞個例子,簡單演示一下使用,做dage和xiaodi兩個表,大哥表是主鍵,小弟表是外來鍵:

建表:1

create

table

`dage` (

2`id`

int(11)

notnull

auto_increment,

3`name`

varchar(32

)default'',

4primary

key(`id`)

5) engine

=innodb

default

charset

=latin1;67

create

table

`xiaodi` (

8`id`

int(11)

notnull

auto_increment,

9`dage_id`

int(11)

default

null,10

`name`

varchar(32

)default'',

11 primary

key(`id`),12

key`dage_id` (`dage_id`),

13constraint

`xiaodi_ibfk_1`

foreign

key(`dage_id`)

references

`dage` (`id`)

14) engine

=innodb

default

charset

=latin1;

插入個大哥: 1

mysql

>

insert

into

dage(name)

values('

銅鑼灣');2

query ok,

1row affected (

0.01

sec)

3mysql

>

select

*from

dage;4+

----+--------+5|

id|name  |6

+----+--------+7|

1|銅鑼灣 |8

+----+--------+91

rowin

set(

0.00

sec)

插入個小弟: 1

mysql

>

insert

into

xiaodi(dage_id,name)

values(1

,'銅鑼灣_小弟a');

2query ok,

1row affected (

0.02

sec)34

mysql

>

select

*from

xiaodi;5+

----+---------+--------------+6|

id|dage_id

|name        |7

+----+---------+--------------+8|

1|1|

銅鑼灣_小弟a |9

+----+---------+--------------+

把大哥刪除: 1

mysql

>

delete

from

dage

whereid=

1;2error

1451

(23000

): cannot

delete

orupdate

a parent row: a

foreign

keyconstraint

fails (`bstar

/xiaodi`,

constraint

`xiaodi_ibfk_1`

foreign

key(`dage_id`)

references

`dage` (`id`))

插入乙個新的小弟:

1mysql

>

insert

into

xiaodi(dage_id,name)

values(2

,'旺角_小弟a

');             

2error

1452

(23000

): cannot

addor

update

a child row: a

foreign

keyconstraint

fails (`bstar

/xiaodi`,

constraint

`xiaodi_ibfk_1`

foreign

key(`dage_id`)

references

`dage` (`id`))3

把外來鍵約束增加事件觸發限制:

1mysql

>

show

create

table

xiaodi;23

constraint

`xiaodi_ibfk_1`

foreign

key(`dage_id`)

references

`dage` (`id`)45

mysql

>

alter

table

xiaodi

drop

foreign

keyxiaodi_ibfk_1;

6query ok,

1row affected (

0.04

sec)

7records:

1duplicates:

0warnings:

8mysql

>

alter

table

xiaodi

addforeign

key(dage_id)

references

dage(id)

ondelete

cascade

onupdate

cascade;9

query ok,

1row affected (

0.04

sec)

1records:

1duplicates:

0warnings:0

再次試著把大哥刪了:

1>

delete

from

dage

whereid=1;2

1row affected (

0.01

sec)34

>

select

*from

dage;

5empty

set(

0.01

sec)67

>

select

*from

xiaodi;

8empty

set(

0.00

sec)

得,這回對應的小弟也沒了,沒辦法,誰讓你跟我on delete cascade了呢!

例子說明的應該蠻清楚了吧,其他功能對應手冊自己實踐吧!:-)

mysql 外來鍵 del 記錄 MySQL 外來鍵

在mysql中 1 mysql 資料表主要支援六種型別 分別是 bdb heap isam merge myisam innobdb。這六種又分為兩類,一類是 事務安全型 transaction safe 包括bdb和innodb 其餘都屬於第二類,稱為 非事務安全型 non transaction...

mysql外來鍵和外來鍵約束

1.mysql中 鍵 和 索引 的定義相同,所以外來鍵和主鍵一樣也是索引的一種。不同的是mysql會自動為所有表的主鍵進行索引,但是外來鍵字段必須由使用者進行明確的索引。用於外來鍵關係的字段必須在所有的參照表中進行明確地索引 2.如果表a的主關鍵字是表b中的字段,則該字段稱為表b的外來鍵,表a稱為主...

mysql 外來鍵和外來鍵約束

1.外來鍵 如果公共關鍵字在乙個關係中是主關鍵字,那麼這個公共關鍵字被稱為另乙個關係的外來鍵。就是a表的主鍵,被用到了b表中,此時它就成了外來鍵 2.外來鍵約束 如果想要插入或者更新外來鍵的值,資料庫會和引用表中字段的資料進行驗證,如果插入或更改的值不在被引用的表中,則插入失敗 外來鍵的作用就是保證...