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.外來鍵約束 如果想要插入或者更新外來鍵的值,資料庫會和引用表中字段的資料進行驗證,如果插入或更改的值不在被引用的表中,則插入失敗 外來鍵的作用就是保證...