一、外來鍵約束
mysql通過外來鍵約束來保證表與表之間的資料的完整性和準確性。
外來鍵的使用條件:
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兩個表,大哥表是主鍵,小弟表是外來鍵
建表:create table `dage` (
`id` int(11) not null auto_increment,
`name` varchar(32) default '',
primary key (`id`))
engine=innodb default charset=latin1;
create table `xiaodi` (
`id` int(11) not null auto_increment,
`dage_id` int(11) default null,
`name` varchar(32) default '',
primary key (`id`),
key `dage_id` (`dage_id`),
constraint `xiaodi_ibfk_1` foreign key (`dage_id`) references `dage` (`id`)
) engine=innodb default charset=latin1;
插入個大哥:
mysql> insert into dage(name) values('銅鑼灣');
query ok, 1 row affected (0.01 sec)
mysql> select * from dage;
| id | name |
| 1 | 銅鑼灣 |
1 row in set (0.00 sec)
插入個小弟:
mysql> insert into xiaodi(dage_id,name) values(1,'銅鑼灣_小弟a');
query ok, 1 row affected (0.02 sec)
mysql> select * from xiaodi;
| id | dage_id | name |
| 1 | 1 | 銅鑼灣_小弟a |
把大哥刪除:
mysql> delete from dage where id=1;
error 1451 (23000): cannot delete or update a parent row: a foreign key constraint fails (`bstar/xiaodi`, constraint `xiaodi_ibfk_1` foreign key (`dage_id`) references `dage` (`id`))
插入乙個新的小弟:
mysql> insert into xiaodi(dage_id,name) values(2,'旺角_小弟a');
error 1452 (23000): cannot add or update a child row: a foreign key constraint fails (`bstar/xiaodi`, constraint `xiaodi_ibfk_1` foreign key (`dage_id`) references `dage` (`id`))
把外來鍵約束增加事件觸發限制:
mysql> show create table xiaodi;
constraint `xiaodi_ibfk_1` foreign key (`dage_id`) references `dage` (`id`)
mysql> alter table xiaodi drop foreign key xiaodi_ibfk_1;
query ok, 1 row affected (0.04 sec)
records: 1 duplicates: 0 warnings:
mysql> alter table xiaodi add foreign key(dage_id) references dage(id) on delete cascade on update cascade;
query ok, 1 row affected (0.04 sec)
records: 1 duplicates: 0 warnings: 0
再次試著把大哥刪了:
mysql> delete from dage where id=1;
query ok, 1 row affected (0.01 sec)
mysql> select * from dage;
empty set (0.01 sec)
mysql> select * from xiaodi;
empty set (0.00 sec)
需要注意點:
mysql允許使用外來鍵,但是為了完整性檢驗的目的,在除了innodb表型別之外的所有表型別中都忽略了這個功能。這可能有些怪異,實際上卻非常正常:對於資料庫的所有外來鍵的每次插入、更新和刪除後,進行完整性檢查是乙個耗費時間和資源的過程,它可能影響效能,特別是當處理複雜的或者是纏繞的連線樹時。
因而,使用者可以在表的基礎上,選擇適合於特定需求的最好結合。所以,如果需要更好的效能,並且不需要完整性檢查,可以選擇使用myisam表型別,如果想要在mysql中根據參照完整性來建立表並且希望在此基礎上保持良好的效能,最好選擇表結構為innodb型別。
mysql 外來鍵說明 Mysql外來鍵詳細說明
在mysql中,innodb引擎型別的表支援了外來鍵約束。constraint symbol foreign key id index col name,references tbl name index col name,on delete on update alter table serial...
MYSQL 外來鍵 作用說明
外來鍵 是個 或數個 指向另外乙個 主鍵的字段。外來鍵的目的是確定資料的參考完整性 referential integrity 換言之,只有被准許的資料值才會被存入資料庫內。舉例來說,假設我們有兩個 乙個 customer 裡面記錄了所有顧客的資料 另乙個 orders 裡面記錄了所有顧客訂購的資料...
mysql 外來鍵 del 記錄 MySQL 外來鍵
在mysql中 1 mysql 資料表主要支援六種型別 分別是 bdb heap isam merge myisam innobdb。這六種又分為兩類,一類是 事務安全型 transaction safe 包括bdb和innodb 其餘都屬於第二類,稱為 非事務安全型 non transaction...