資料庫 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中利用外來鍵實現級聯刪除成功!
mysql 主鍵 外來鍵
1 候選鍵 關係中的乙個屬性組,其值能唯一標識乙個元組,若從該屬性組中去掉任何乙個屬性,它就不具有這一性質了,這樣的屬性組稱作候選碼。比如人的自然屬性 身高,體重,年齡,指紋樣式.2 主鍵 當有多個候選碼時,可以選定乙個作為主碼,選定的候選碼稱主鍵。主鍵是能確定一條記錄的唯一標識 比如上面例子中的指...
mysql主鍵 外來鍵
主鍵是能確定一條記錄的唯一標識,主鍵字段必須唯一,必須非空,乙個表中只能有乙個主鍵,主鍵可以包含乙個或多個字段。打個比方,一條記錄包括身份正號,姓名,年齡,學校,國籍,性別等。身份證號是唯一能確定你這個人的,其他都可能有重複,所以,身份證號是主鍵。外來鍵表示了兩個關係之間的相關聯絡。以另乙個關係的外...
mysql的主鍵 外來鍵約束 MySQL 主鍵外來鍵
笛卡兒積 多表查詢 多個表變成乙個表 完整性約束條件 primary key 標識該屬性為該錶的主鍵,可以唯一的標識對應的元組 foreign key 標識該屬性為該錶的外來鍵,是與之聯絡的某錶的主鍵 not null 標識該屬性不能為空 unique 標識該屬性的值是唯一的 auto increm...