Sql多對多關係中外鍵的應用

2022-08-12 17:21:15 字數 3463 閱讀 3886

業務需求:使用者表r_user儲存使用者名稱等資訊。現需要給每個使用者設定工作基地,乙個使用者可以有多個工作基地,多個使用者也可以有乙個工作基地,即多對多關係。(外來鍵,若有兩個表a,b,c是a的主鍵,而b中也有c欄位,則c就是表b的外來鍵,外來鍵約束主要用來維護兩個表之間資料的一致性)

設計方案:

方案一:建立一張使用者基地表,與r_user與使用者基地表,保持一對多的關係,如圖所示,r_user的主鍵id做為r_user_base的外來鍵user_id。通過r_user中的id,在r_user_base表中load該使用者的所有工作基地。

方案二:建立一張個基地表base_info儲存目前存在的所有基地,再建一張user_base關係表。如圖所示,關係表user_base有兩個外來鍵user_id與base_id 

方案一的特點是,只需要鍵一張表就可以完成業務需求。缺點是不夠模組化,如果在其它地方還要用到基地資訊,則還要再建基地表

方案二的特點是,用一張關係表連線兩張資訊表。便於資訊表的維護與重複利用。

基於業務需求與以後擴充套件及重用性考慮,採用方案二實現需求。

在mysql 3.23.44版本後,innodb引擎型別的表支援了外來鍵約束。

外來鍵的使用條件:

1.兩個表必須是innodb表,myisam表暫時不支援外來鍵(據說以後的版本有可能支援,但至少目前不支援);

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

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

外來鍵的定義語法:

[constraint symbol] foreign key [id] (index_col_name, ...)

references tbl_name (index_col_name, ...)

[on delete ]

[on update ]

cascade方式

在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄 

on delete cascade從mysql3.23.50開始可用; on update cascade從mysql4.0.8開始可用 。

set null方式

在父表上update/delete記錄時,將子表上匹配記錄的列設為null 

要注意子表的外來鍵列不能為not null 

on delete set null從mysql3.23.50開始可用; on update set null從mysql4.0.8開始可用 

no action方式

如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行update/delete操作 

這個是ansi sql-92標準,從mysql4.0.8開始支援 

restrict方式

同no action, 都是立即檢查外來鍵約束 

建立人員資訊表:

1 create table `r_user` (

2 `id` bigint(20) not null auto_increment,

3 `name` varchar(20) default null,

4 `password` varchar(50) default null,

5 `staff_num` varchar(20) default null,

6 `user_name` varchar(20) default null,

7 primary key (`id`),

8 ) engine=innodb auto_increment=54 default charset=utf8

建立基地資訊表

1 create table `branch_info` (

2 `id` bigint(20) not null auto_increment,

3 `branch_code` varchar(255) default null,

4 `branch_desc` varchar(255) default null,

5 primary key (`id`)

6 ) engine=innodb auto_increment=19 default charset=utf8

關係表:

1 create table `user_work_base` (

2 `id` bigint(20) not null auto_increment,

3 `version` int(11) not null,

4 `user_id` bigint(20) not null ,

5 `base_id` bigint(20) not null ,

6 primary key (`id`),

7 constraint `user_work_base_ibfk_1` foreign key (`user_id`) references `r_user` (`id`) on delete cascade on update cascade,

8 constraint `user_work_base_ibfk_2` foreign key (`base_id`) references `branch_info` (`id`) on delete cascade on update cascade

9 ) engine=innodb auto_increment=37 default charset=utf8

刪除人員r_user表中人員a,關係表user_base自動刪除a的關係資料。

如果外來鍵使用restrict方式,只刪除a,則報錯。

cannot delete or update a parent row: a foreign key constraint fails (`maircrew`,`user_work_base`, constraint `fk41eb46d32aa89ea0` 

foreign key (`user_id`) references `r_user` (`id`))

多對多關係

實體模型中相關的模型之間為了方便查詢需要做到你中有我 我中有你 一對多表設計上是在多方應用少方的主鍵作為外來鍵約束 模型上需要在多方加入乙個少方模型物件的屬性,在少方加入乙個多方物件的列表 語法 少方物件 db.relationship 少方模型名 backref db.backref xxlist...

Flask sqlalchemy多對多關係

from flask import flask from flask sqlalchemy import sqlalchemy article tag db.table article tag db.column article id db.integer,db.foreignkey article...

多對多關係對映

需要用到 manytomany註解,然後在需要維護關係的一方,加上 jointable註解。必須指定乙個維護關係,否則會導致關係表id重複出現錯誤。jointable 有以下屬性,joincolumns 設定該實體類對映在關係表中的外來鍵列名和參照列,inversecolumns 設定和該實體類關聯...