1. 程式人生 > >mysql 設定外來鍵

mysql 設定外來鍵

資料庫 mysql 建立外來鍵的前提:本表的列必須與外來鍵型別相同(外來鍵
必須是外表主鍵)。
外來鍵作用: 使兩張表形成關聯,外來鍵只能引用外表中的列的值!
指定主鍵關鍵字: foreign key(列名)
引用外來鍵關鍵字: references <外來鍵表名>(外來鍵列名)
事件觸發限制: on delete 和on update , 可設引數cascade(跟隨外來鍵改
動), restrict(限制外表中的外來鍵改動),set Null(設空值),set Default(設
預設值),[預設]no action
例如:
outTable 表主鍵 id 型別int
建立含有外來鍵的表:
create table temp(
id int,
name char(20),
foreign key(id) references outTable(id) on delete cascade on update
cascade);
說明:把id 列設為外來鍵參照外表 outTable 的id 列當外來鍵的值刪除
本表中對應的列刪除當外來鍵的值改變本表中對應的列值改變。
自己實踐 才能完全瞭解外來鍵的作用關鍵是:事件觸發限制的作用
restrict 在沒有刪除引用id 的時候不允許刪除背引用id
no action 在沒有刪除引用id 的時候不允許刪除背引用id
cascade 級聯刪除
set null 在刪除被引用id 的時候會把引用id 置為空
有時沒有外來鍵設定選項是怎麼回事呢?是因為storage engine 的原因,
設定為ENGINE= InnoDB 就可以了。
用 phpmyadmin 怎麼建MySQL 的外來鍵
在 PHPMYADMIN 中暫時還沒有見到所見即所得的外來鍵定義方式.
你可以使用SQL指令去建立
語法如下:
ALTER TABLE 表名ADD FOREIGN KEY (欄位名) REFERENCES
表名(欄位名)
如果直接刪除外來鍵,會報錯
首先先找到該外來鍵的名稱,FK_Relationship_77
先操作刪除外來鍵名稱
alter table tbl_products drop foreign key FK_Relationship_77
然後在操作刪除欄位
alter table tbl_products drop column ProductLogicClassesId
下面是一個例項
首先,目前在產品環境可用的MySQL 版本(指4.0.x 和4.1.x)中,
只有 InnoDB 引擎才允許使用外來鍵,所以,我們的資料表必須使用
InnoDB引擎。
下面,我們先建立以下測試用資料庫表:
CREATE TABLE `roottb` (
`id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
`data` VARCHAR(100) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) TYPE=InnoDB;
CREATE TABLE `subtb` (
`id` INT(11) UNSIGNED AUTO_INCREMENT NOT NULL,
`rootid` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`data` VARCHAR(100) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
INDEX (`rootid`),
FOREIGN KEY (`rootid`) REFERENCES roottb(`id`) ON DELETE
CASCADE
) TYPE=InnoDB;
注意:
1、必須使用InnoDB引擎;
2、外來鍵必須建立索引(INDEX);
3、外來鍵繫結關係這裡使用了“ ON DELETE CASCADE”,意思是如果
外來鍵對應資料被刪除,將關聯資料完全刪除,更多資訊請參考MySQL
手冊中關於InnoDB的文件;
好,接著我們再來插入測試資料:
INSERT INTO `roottb` (`id`,`data`)
VALUES ('1', 'test root line 1'),
('2', 'test root line 2'),
('3', 'test root line 3');
INSERT INTO `subtb` (`id`,`rootid`,`data`)
VALUES ('1', '1', 'test sub line 1 for root 1'),
('2', '1', 'test sub line 2 for root 1'),
('3', '1', 'test sub line 3 for root 1'),
('4', '2', 'test sub line 1 for root 2'),
('5', '2', 'test sub line 2 for root 2'),
('6', '2', 'test sub line 3 for root 2'),
('7', '3', 'test sub line 1 for root 3'),
('8', '3', 'test sub line 2 for root 3'),
('9', '3', 'test sub line 3 for root 3');
我們先看一下當前資料表的狀態:
mysql>; show tables;
+----------------+
| Tables_in_test |
+----------------+
| roottb |
| subtb |
+----------------+
2 rows in set (0.00 sec)
mysql>; select * from `roottb`;
+----+------------------+
| id | data |
+----+------------------+
| 1 | test root line 1 |
| 2 | test root line 2 |
| 3 | test root line 3 |
+----+------------------+
3 rows in set (0.05 sec)
mysql>; select * from `subtb`;
+----+--------+----------------------------+
| id | rootid | data |
+----+--------+----------------------------+
| 1 | 1 | test sub line 1 for root 1 |
| 2 | 1 | test sub line 2 for root 1 |
| 3 | 1 | test sub line 3 for root 1 |
| 4 | 2 | test sub line 1 for root 2 |
| 5 | 2 | test sub line 2 for root 2 |
| 6 | 2 | test sub line 3 for root 2 |
| 7 | 3 | test sub line 1 for root 3 |
| 8 | 3 | test sub line 2 for root 3 |
| 9 | 3 | test sub line 3 for root 3 |
+----+--------+----------------------------+
9 rows in set (0.01 sec)
嗯,一切都正常,好,下面我們要試驗我們的級聯刪除功能了。
我們將只刪除roottb 表中id 為2 的資料記錄,看看subtb 表中rootid
為2 的相關子紀錄是否會自動刪除:
mysql>; delete from `roottb` where `id`='2';
Query OK, 1 row affected (0.03 sec)
mysql>; select * from `roottb`;
+----+------------------+
| id | data |
+----+------------------+
| 1 | test root line 1 |
| 3 | test root line 3 |
+----+------------------+
2 rows in set (0.00 sec)
mysql>; select * from `subtb`;
+----+--------+----------------------------+
| id | rootid | data |
+----+--------+----------------------------+
| 1 | 1 | test sub line 1 for root 1 |
| 2 | 1 | test sub line 2 for root 1 |
| 3 | 1 | test sub line 3 for root 1 |
| 7 | 3 | test sub line 1 for root 3 |
| 8 | 3 | test sub line 2 for root 3 |
| 9 | 3 | test sub line 3 for root 3 |
+----+--------+----------------------------+
6 rows in set (0.01 sec)
subtb 表中對應資料確實自動刪除了,測試成功。
結論:在MySQL中利用外來鍵實現級聯刪除成功!