[
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...