MySQL之外鍵的使用

2021-10-08 08:43:52 字數 3282 閱讀 5190

[

constraint

《外鍵名》

]foreign

key 欄位名 [,欄位名2,…]

references

《主表名》 主鍵列1

[,主鍵列2,…]

另外,建立外來鍵時再後邊還可以設定更刪時策略(cascade、no action、restrict、set null)

建主表

create

table

`testtab`

(`id`

int(11)

notnull

auto_increment

,`name`

varchar

(255

)default

null

,primary

key(

`id`))

engine

=innodb

auto_increment=5

default

charset

=utf8;

建從表
create

table

`testtab1`

(`pid`

int(11)

notnull

,`phone`

varchar(20

)default

null

,`salary`

int(10)

default

null

,key

`id`

(`pid`),

constraint

`id`

foreign

key(

`pid`

)references

`testtab`

(`id`)on

delete

cascade

onupdate

cascade

# delete cascade on update cascade 更刪級聯

)engine

=innodb

default

charset

=utf8;

向主從表新增資料

可以看到,向從表中新增pid=3的資料報錯,這是因為主表中找不到id=3的資料

mysql>

select

*from testtab;

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

| id | name |

+----+------+|1

| tom ||2

| ken |

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

2rows

inset

(0.02 sec)

mysql>

insert

into testtab1 values(1

,'17694561200'

,12000);

query ok,

1row affected (

0.09 sec)

mysql>

insert

into testtab1 values(3

,'15623412011'

,10000);

1452

- cannot add

orupdate a child row: a foreign

keyconstraint fails (

`spring`

.`testtab1`

,constraint

`id`

foreign

key(

`pid`

)references

`testtab`

(`id`)on

delete

cascade

onupdate

cascade

)mysql>

select

*from testtab1;

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

| pid | phone | salary |

+-----+-------------+--------+|1

|17694561200

|12000|+

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

1row

inset

(0.02 sec)

mysql>

刪除表資料

設定了更刪級聯後,在對主表資料刪除時會同時刪除從表中關聯的資料,對從表刪除時不會影響到主表

反之不設定,則如果要刪除的主表資料在對應從表有記錄則會報錯(cannot delete or update a parent row: a foreign key constraint fails),刪除的從表中未關聯的可以刪除ok;直接刪除從表資料也是ok的

mysql>

delete

from testtab where id =1;

query ok,

1row affected (

0.06 sec)

mysql>

select

*from testtab;

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

| id | name |

+----+------+|2

| ken |

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

1row

inset

(0.06 sec)

mysql>

select

*from testtab1;

empty set

mysql>

insert

into testtab1 values(2

,'17694561200'

,12000);

query ok,

1row affected (

0.08 sec)

mysql>

delete

from testtab where name=

'ken'

;query ok,

1row affected (

0.03 sec)

mysql>

select

*from testtab1;

empty set

mysql>

mysql之外鍵

乙個是讓資料庫自己通過外來鍵來保證資料的完整性和一致性 乙個就是能夠增加er圖的可讀性 有些人認為外來鍵的建立會給開發時運算元據庫帶來很大的麻煩.因為資料庫有時候會由於沒有通過外來鍵的檢測而使得開發人員刪除,插入操作失敗.他們覺得這樣很麻煩 其實這正式外來鍵在強制你保證資料的完整性和一致性.這是好事...

MySQL之外鍵約束

mysql有兩種常用的引擎型別 myisam和innodb。目前只有innodb引擎型別支援外來鍵約束。innodb中外鍵約束定義的語法如下 constraint symbol foreign key index name index col name,referencestbl name inde...

MySQL之外鍵約束

mysql有兩種常用的引擎型別 myisam和innodb。目前只有innodb引擎型別支援外來鍵約束。innodb中外鍵約束定義的語法如下 constraint symbol foreign key index name index col name,references tbl name ind...