程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 疾速懂得MySQL中主鍵與外鍵的實例教程

疾速懂得MySQL中主鍵與外鍵的實例教程

編輯:MySQL綜合教程

疾速懂得MySQL中主鍵與外鍵的實例教程。本站提示廣大學習愛好者:(疾速懂得MySQL中主鍵與外鍵的實例教程)文章只能為提供參考,不一定能成為您想要的結果。以下是疾速懂得MySQL中主鍵與外鍵的實例教程正文


主鍵與外鍵的關系,淺顯點兒講,我如今有一個服裝論壇t.vhao.net,有兩張表,一張是主貼 thread,一張是回帖 reply

先說說主鍵,主鍵是內外面獨一辨認記載的字段,普通是帖子id,表現在拜訪的時刻,例如是
thread.php?id=1   表現我要拜訪的是帖子id是1 的帖子~

再來講說外鍵,當我們刪除某個帖子的時刻,須要履行另外一個操作,就是刪除一切回帖,假如正常情形下,我們須要履行兩次delete操作(thread和 reply),這時候候假如存在外鍵,例如,在reply 內外面樹立一個指向thread表的主鍵(id)的外鍵(這個外鍵綁的字段,必需是對應帖子的id),並指定呼應 delete ,那你在刪除 thread 的時刻,mysql 本身會幫你把 reply 表中這個帖子的答復都刪失落,而不須要你手動再去履行一次reply表的delete操作~

至於二者之間的關系,在適才的例子中,reply 表的外鍵,指向的就是 thread 表的主鍵~~

弄個例子,簡略演示一下應用,做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');   

       

2ERROR 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)


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

例子解釋的應當蠻清晰了吧,其他功效對應手冊本身理論吧!:-)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved