員工資訊表有三個字段:工號 姓名 部門
公司有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
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中是...