Mysql外來鍵約束設定使用方法

2021-08-21 07:06:46 字數 4032 閱讀 2380

總結:

建立外來鍵語法:

[constraint [symbol]] foreign key

[index_name] (index_col_name, ...)

references tbl_name (index_col_name,...)

[on delete reference_option]

[on update reference_option] 

reference_option:

restrict | cascade | set null | no action

mysql外來鍵約束條件

mysql的外來鍵約束條件有以下幾種:

· cascade : 從父表刪除或更新行時自動刪除或更新子表中匹配的行。

· set null : 從父表刪除或更新行時自動設定子表對應的外來鍵列值為null。前提是對應外來鍵列沒有指定not null限定詞。

· no action : 在ansi sql-92標準中,no action意味著不採取任何動作。

· restrict : 拒絕對父表的刪除或更新操作。

[constraint [symbol]]只是外來鍵約束的乙個標誌

建立時指定,刪除指定外來鍵可以使用這個標識

alter table article drop foreign key 

fk_1;

正文:

如果表a的主關鍵字是表b中的字段,則該字段稱為表b的外來鍵,表a稱為主表,表b稱為從表。外來鍵是用來實現參照完整性的,不同的外來鍵約束方式將可以使兩張表緊密的結合起來,特別是修改或者刪除的級聯操作將使得日常的維護工作更加輕鬆。外來鍵主要用來保證資料的完整性和一致性

兩個表必須是innodb表,myisam表暫時不支援外來鍵

外來鍵列必須建立了索引,mysql 4.1.2以後的版本在建立外來鍵時會自動建立索引,但如果在較早的版本則需要顯示建立;

外來鍵關係的兩個表的列必須是資料型別相似,也就是可以相互轉換型別的列,比如int和tinyint可以,而int和char則不可以;

建立外來鍵語法:

[constraint [symbol]] foreign key

[index_name] (index_col_name, ...)

references tbl_name (index_col_name,...)

[on delete reference_option]

[on update reference_option] 

reference_option:

restrict | cascade | set null | no action

如果子表試圖建立乙個在父表中不存在的外鍵值,innodb會拒絕任何insert或update操作。如果父表試圖update或者delete任何子表中存在或匹配的外鍵值,最終動作取決於外來鍵約束定義中的on update和on delete選項。innodb支援5種不同的動作,如果沒有指定on delete或者on update,預設的動作為restrict:

1. cascade: 從父表中刪除或更新對應的行,同時自動的刪除或更新自表中匹配的行。on delete canscade和on update canscade都被innodb所支援。

2. set null: 從父表中刪除或更新對應的行,同時將子表中的外來鍵列設為空。注意,這些在外鍵列沒有被設為not null時才有效。on delete set null和on update set set null都被innodb所支援。

3. no action: innodb拒絕刪除或者更新父表。

4. restrict: 拒絕刪除或者更新父表。指定restrict(或者no action)和忽略on delete或者on update選項的效果是一樣的。

5. set default: innodb目前不支援。

外來鍵約束使用最多的兩種情況:

1)父表更新時子表也更新,父表刪除時如果子表有匹配的項,刪除失敗;

2)父表更新時子表也更新,父表刪除時子表匹配的項也刪除。

前一種情況,在外鍵定義中,我們使用on update cascade on delete restrict;

後一種情況,可以使用on update cascade on delete cascade。

使用案例:

(1)建立表:

**如下     複製**

---- 原創

-- create table if not exists `article` (

`id` int(11) not null auto_increment,

`category_id` int(11) not null,

`name` char(16) not null,

primary key (`id`),

key `fk_1` (`category_id`)

) engine=innodb default charset=utf8 auto_increment=2 ;

insert into `article` (`id`, `category_id`, `name`) values

(1, 1, '文章1');

create table if not exists `category` (

`id` int(11) not null auto_increment,

`name` char(16) not null,

primary key (`id`)

) engine=innodb default charset=utf8 auto_increment=2 ;

insert into `category` (`id`, `name`) values

(1, '分類1');

建立外來鍵約束:

**如下     複製**

alter table `article`

add constraint `fk_1` foreign key (`category_id`) references `category` (`id`);

(2)刪除主表category中資料:delete from `category` where id=1,會報錯:

#1451 - cannot delete or update a parent row: a foreign key constraint fails (`test`.`article`, constraint `fk_1` foreign key (`category_id`) references `category` (`id`))

(3)從表article中,新增不存在的category_id:insert into article(category_id,name) values(2,'分類2') 會報錯:

#1452 - cannot add or update a child row: a foreign key constraint fails (`test`.`article`, constraint `fk_1` foreign key (`category_id`) references `category` (`id`))

(4)更改更新刪除約束

**如下     複製**

--刪除外來鍵

alter table article drop foreign key fk_1

--新增外來鍵

alter table `article` add constraint `fk_1` foreign key ( `category_id` )

references `category` ( `id` )

on delete cascade on update cascade

此時如下操作:

**如下     複製**

--此時article中的記錄也會被刪除

delete from category where id=1;

--此時article中的category_id也會被更新成3

update `test`.`category` set `id` = '3' where `category`.`id` =2;

出處:

mysql約束與外來鍵 MySQL 外來鍵與約束

外來鍵的建立 建表如下 create table parent id int not null,primary key id type innodb create table child id int,parent id int,foreign key parent id references pa...

MySQL自學筆記 設定外來鍵約束

1.外來鍵約束的要求 a.父表和子表必須使用相同的儲存引擎,而且禁止使用臨時表。b.資料表的儲存引擎只能為innodb。c.外來鍵和參照列必須具有相似的資料型別。其中數字的長度或是否有符號位必須相同 而字元的 長度則可以不同。d.外來鍵列和參照列必須建立索引。注意 建立外來鍵時,定義外鍵名時,不能加...

MySQL 外來鍵約束

建立測試主表.id 是主鍵.create table test main id int,value varchar 10 primary key id 建立測試子表.create table test sub id int,main id int,value varchar 10 primary k...