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

2021-07-05 23:03:25 字數 3847 閱讀 6435

1.外來鍵約束的要求:

a.父表和子表必須使用相同的儲存引擎,而且禁止使用臨時表。

b.資料表的儲存引擎只能為innodb。

c.外來鍵和參照列必須具有相似的資料型別。其中數字的長度或是否有符號位必須相同;而字元的

長度則可以不同。

d.外來鍵列和參照列必須建立索引。

注意:建立外來鍵時,定義外鍵名時,不能加引號.

如: constraint 'fk_1' 或 constraint "fk_1"是錯誤的

2.外來鍵的使用:

外來鍵的作用:

a.讓資料庫自己通過外來鍵來保證資料的完整性和一致性。

b.能夠增加er圖的可讀性。

c.實現一對一或一對多關係。

有些人認為外來鍵的建立會給開發時運算元據庫帶來很大的麻煩.因為資料庫有時候會由於

沒有通過外來鍵的檢測而使得開發人員刪除,插入操作失敗.他們覺得這樣很麻煩,其實這正是外

鍵在強制你保證資料的完整性和一致性.

例如:有乙個基礎資料表,用來記錄商品的所有資訊。其他表都儲存商品id。查詢時需要連表來

查詢商品的名稱。單據1的商品表中有商品id欄位,單據2的商品表中也有商品id欄位。如果不

使用外來鍵的話,當單據1,2都使用了商品id=3的商品時,如果刪除商品表中id=3的對應記錄後,

再檢視單據1,2的時候就會查不到商品的名稱。

當表很少的時候,有人認為可以在程式實現的時候來通過寫指令碼來保證資料的完整性和一致

性。也就是在刪除商品的操作的時候去檢測單據1,2中是否已經使用了商品id為3的商品。但是

當你寫完指令碼之後系統有增加了乙個單據3 ,他也儲存商品id找個字段。如果不用外來鍵,你還

是會出現查不到商品名稱的情況。你總不能每增加乙個使用商品id的字段的單據時就回去修改

你檢測商品是否被使用的指令碼吧,同時,引入外來鍵會使速度和效能下降。

3. 新增外來鍵的格式:

alter  table  tablename

add [constraint 外鍵名]  foreign  key [id] (index_col_name, ...)

references  tbl_name (index_col_name, ...)

[on delete ]

[on update ]

說明:on delete/on update,用於定義delete,update操作.以下是update,delete操作的各種約束型別:

cascade:

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

restrict:

restrict也相當於no action,即不進行任何操作.即拒絕對父表的刪除或更新操作.

set null:

從父表中刪除或更新行時,子表的外來鍵列被自動設定為null.

注意:如果使用該選項,必須保證子表中沒有指定not null.

4.檢視外來鍵:

show  create  table tablename;可以檢視到新建的表的**以及其儲存引擎.也就可以看到外來鍵的設定.

刪除外來鍵:

alter table drop foreign key '外鍵名'.

注意:只有在定義外來鍵時,用constraint 外鍵名 foreign key .... 方便進行外來鍵的刪除.

若不定義,則可以:

先輸入:alter table drop foreign key -->會提示出錯.此時出錯資訊中,會顯示foreign key的系統缺省外鍵名.--->

用它去刪除外來鍵.

5.舉例

例項一:

5.1create table parent(id int not null,

primary key (id)

) type=innodb;                      -- type=innodb 相當於 engine=innodb

create table child(id int, parent_id int,

index par_ind (parent_id),

foreign key (parent_id) references parent(id)

on delete cascade

) type=innodb;

向parent插入資料後,向child插入資料,插入時,child中的parent_id的值只能是parent中有的資料,否則插入不成功;

刪除parent記錄時,child中的相應記錄也會被刪除;-->因為: on delete cascade

更新parent記錄時,不給更新;-->因為沒定義,預設採用restrict.

5.2若child如下:

mysql>

create table child(id int not null primary key auto_increment,parent_id int,

index par_ind (parent_id),

constraint fk_1 foreign key (parent_id) references

parent(id) on update cascade on delete restrict)

type=innodb;

用上面的:

1).則可以更新parent記錄時,child中的相應記錄也會被更新;-->因為: on update cascade

2).不能是子表操作,影響父表.只能是父表影響子表.

3).刪除外來鍵:

alter table child drop foreign key fk_1;

新增外來鍵:

alter table child add constraint fk_1 foreign key (parent_id) references

parent(id) on update restrict on delete set null;

6. 多個外來鍵存在:

product_order表對其它兩個表有外來鍵。

乙個外來鍵引用乙個product表中的雙列索引。另乙個引用在customer表中的單行索引:

create table product (category int not null, id int not null,

price decimal,

primary key(category, id)) type=innodb;

create table customer (id int not null,

primary key (id)) type=innodb;

create table product_order (no int not null auto_increment,

product_category int not null,

product_id int not null,

customer_id int not null,

primary key(no),

-- 雙外來鍵

index (product_category, product_id),

foreign key (product_category, product_id)

references product(category, id)

on update cascade on delete restrict,

-- 單外來鍵

index (customer_id),

foreign key (customer_id)

references customer(id)) type=innodb;

說明:1.若不宣告on update/delete,則預設是採用restrict方式.

2.對於外來鍵約束,最好是採用: on update cascade on delete restrict 的方式.

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 外來鍵約束

建立測試主表.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...

MySQL外來鍵約束

innodb型別表有乙個其他儲存引擎不支援的特性 外來鍵約束。當b表的外來鍵關聯到a表的主鍵時 表b是父表a表的子表 如果刪除了a表,那麼b中的外來鍵則仍然關聯著乙個不存在的表的主鍵。而外鍵約束則設定了當約束被破壞時應該應用的的規則,包括防止約束破壞。建立乙個外來鍵約束的語法是 foreign ke...