資料庫 外來鍵

2022-08-14 01:24:14 字數 4727 閱讀 5621

員工資訊表有三個字段:工號 姓名 部門

公司有3個部門,但是有1個億的員工,那意味著部門這個字段需要重複儲存,部門名字越長,越浪費

解決方法:

我們完全可以定義乙個部門表

然後讓員工資訊表關聯該錶,如何關聯,即foreign key

將所有資料存放在一張表中的弊端:

結構不清晰

浪費空間

可擴充套件性極差

解決弊端需要拆分**,並在**之間建立一種強有力的關係,使用外來鍵

外來鍵:用來建立兩張表之間的關係

一對多多對多

一對一

#表型別必須是innodb儲存引擎,且被關聯的字段,即references指定的另外乙個表的字段,必須保證唯一

create

table

department(

id int

primary

key,

name

varchar(20) not

null

)engine

=innodb;

#dpt_id外來鍵,關聯父表(department主鍵id),同步更新,同步刪除

create

table

employee(

id int

primary

key,

name

varchar(20) not

null

,dpt_id

int,

constraint fk_name foreign

key(dpt_id)

references

department(id)

ondelete

cascade

onupdate

cascade

)engine

=innodb;

需要先往父表department中插入資料,再往子表employee中插入資料

刪除父表department中的資料,子表employee中的對應的記錄也會刪除

更新父表department,子表employee中對應的記錄跟著修改

分析步驟:

是否左表的多條記錄可以對應右表的一條記錄,如果是,則證明左表的乙個欄位foreign key 右表乙個字段(通常是id)

是否右表的多條記錄可以對應左表的一條記錄,如果是,則證明右表的乙個欄位foreign key 左表乙個字段(通常是id

多對一

如果只有步驟1成立,則是左表多對一右表;如果只有步驟2成立,則是右表多對一左表

多對多

如果步驟1和2同時成立,則證明這兩張表時乙個雙向的多對一,即多對多,需要定義乙個這兩張表的關係表來專門存放二者的關係

一對一

如果1和2都不成立,而是左表的一條記錄唯一對應右表的一條記錄,反之亦然。這種情況很簡單,就是在左表foreign key右表的基礎上,將左表的外來鍵字段設定成unique即可

兩張表:出版社和書,乙個出版社可以出版多本書,一本書只有乙個出版社

# 多對一

# 出版社表

create

table

press(

id int

primary

keyauto_increment,

name

varchar(20));

# 書表

create

table

book(

id int

primary

keyauto_increment,

name

varchar(20

),press_id

intnot

null

,foreign

key(press_id) references

press(id)

ondelete

cascade

onupdate

cascade

);

兩張表:作者和書,乙個作者可以有多本書,一本書也可以有多個作者

# 多對多

# 作者表

create

table

author(

id int

primary

keyauto_increment,

name

varchar(20));

# 書表

create

table

book(

id int

primary

keyauto_increment,

name

varchar(20));

#這張表就存放作者表與書表的關係,即查詢二者的關係查這錶就可以了

create

table

author2book(

id int

notnull

unique

auto_increment,

author_id

intnot

null

,book_id

intnot

null

,constraint fk_author foreign

key(author_id) references

author(id)

ondelete

cascade

onupdate

cascade

,constraint fk_book foreign

key(book_id) references

book(id)

ondelete

cascade

onupdate

cascade

,primary

key(author_id,book_id)

);

兩張表:學生表和客戶表,乙個學生是乙個客戶,乙個客戶有可能變成乙個學校,即一對一的關係

#一定是student來foreign key表customer,這樣就保證了:#1

學生一定是乙個客戶,#2

客戶不一定是學生,但有可能成為乙個學生

create

table

customer(

id int

primary

keyauto_increment,

name

varchar(20) not

null

,qq

varchar(10) not

null

,phone

char(16) not

null

);create

table

student(

id int

primary

keyauto_increment,

class_name

varchar(20) not

null

,customer_id

intunique

, #該欄位一定要是唯一的

foreign

key(customer_id) references

customer(id) #外來鍵的字段一定要保證unique

ondelete

cascade

onupdate

cascade

);

語法:

1. 修改表名

alter

table

表名 rename 新錶名;

2. 增加字段

alter

table

表名add 欄位名 資料型別 [

完整性約束條件…],

add 欄位名 資料型別 [

完整性約束條件…];

alter

table

表名add 欄位名 資料型別 [

完整性約束條件…

]first;

alter

table

表名add 欄位名 資料型別 [

完整性約束條件…

]after 欄位名;

3. 刪除字段

alter

table

表名 drop

欄位名;

4. 修改字段

alter

table

表名 modify 欄位名 資料型別

[完整性約束條件…];

alter

table

表名 change 舊欄位名 新欄位名 舊資料型別

[完整性約束條件…];

alter

table

表名 change 舊欄位名 新欄位名 新資料型別

[完整性約束條件…

];

複製表結構+記錄 (key不會複製: 主鍵、外來鍵和索引)

mysql

>

create

table new_service select

*from

service;

只複製表結構

mysql

>

create

table new1_service select

*from service where1=

2;

資料庫 外來鍵

外來鍵是什麼?外來鍵 fk 是用於建立和加強兩個表資料之間的鏈結的一列或多列。通過將儲存表中主鍵值的一列或多列新增到另乙個表中,可建立兩個表之間的鏈結。這個列就成為第二個表的外來鍵。外來鍵資料庫一級的完整性約束,由資料庫自行維護.你也可以手動建立.1如果存在外來鍵關係的話,任何修改主表主鍵欄位和刪除...

資料庫外來鍵

主鍵 能夠唯一標識表中某一行的屬性或屬性組。乙個表只能有乙個主鍵,但是可以有多個索引。主鍵常常與外來鍵構成完整性約束,防止出現資料的不一致,資料庫管理系統對於主鍵自動生成唯一索引,所以主鍵是乙個特殊的索引。外來鍵 用於建立和加強兩個表資料之間的連線的一列或者多列。外來鍵主要是用來維護兩個表之間的資料...

資料庫外來鍵

概念 table2的乙個鍵關聯table1的主鍵 foreign key 作用 保持資料的一致性和完整性 表的字段必須與外來鍵型別相同 insert table2的時候會檢查foreign key是否在table1中存在,不存在則返回失敗 delete table1某行資料的時候檢查table2中是...