MySQL主鍵外來鍵設定方法

2021-06-22 23:08:08 字數 4990 閱讀 1435

資料庫 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...