mysql 表關係 與 修改表結構 [TOC] 兩張表關係 多對一 以員工和部門舉例 多個員工對應一個部門 foreign key 永遠是在多的那張表中設置外鍵 多個員工對應一個部門 員工表關聯部門表 員工表是多 部門表是一 foreign key(欄位信息多的) references 表(欄位信息 ...
目錄
mysql 表關係 與 修改表結構
兩張表關係
多對一 以員工和部門舉例 多個員工對應一個部門 foreign key 永遠是在多的那張表中設置外鍵
"""
從左邊的表思考,這張表的多條信息是否能對應上右邊表的一條信息,能對應上(成立),再從右邊的表思考,
右表的多條信息是否能對應上左表的一條信息(不成立),那麼兩張表就可以確定是多對一關係,右表是多,左表是一,右邊表就是設置外鍵的表
"""
- 多個員工對應一個部門
- 員工表關聯部門表
- 員工表是多 部門表是一
foreign key(欄位信息多的) references 表(欄位信息少的)
多對多 以書和作者舉例 多個作者合作出一本書(成立),多本書是一個作者(成立)
這時就(產成第三張表) 把兩個表的id,作為第三張表的外鍵,創建關係表
- 多個作者可以共同出版一本書
- 多本書可以是一個作者寫的
關係表設置外鍵 foreign key 分別對應作者和書的id
一對一 以客戶 和 學員為例 (一個客戶報名繳費後,只能對應一個學員)
- 先有客戶表,客戶成交後成為學員,後出現的學員表設置外鍵,並且要約束這個外鍵是唯一,關聯客戶表一對一關係成立
- 如果1和2都不成立,而是左表的一條記錄唯一對應右表的一條記錄,反之亦然。這種情況很簡單,
就是在左表foreign key右表的基礎上,將左表的外鍵欄位設置成unique即可
分析步驟
"""
#1、先站在左表的角度去找
是否左表的多條記錄可以對應右表的一條記錄,如果是,則證明左表的一個欄位foreign key 右表一個欄位(通常是id)
#2、再站在右表的角度去找
是否右表的多條記錄可以對應左表的一條記錄,如果是,則證明右表的一個欄位foreign key 左表一個欄位(通常是id)
#3、總結:
#多對一:
如果只有步驟1成立,則是左表多對一右表
如果只有步驟2成立,則是右表多對一左表
#多對多
如果步驟1和2同時成立,則證明這兩張表時一個雙向的多對一,即多對多,需要定義一個這兩張表的關係表來專門存放二者的關係
#一對一:
如果1和2都不成立,而是左表的一條記錄唯一對應右表的一條記錄,反之亦然。這種情況很簡單,
就是在左表foreign key右表的基礎上,將左表的外鍵欄位設置成unique即可
"""
修改表結構
對錶結構進行修改的情況在那些時候發生?
- 創建項目之前
- 項目開發、運行過程中
"""
語法:
1. 修改表名
alter table 表名
rename 新表名;
2. 增加欄位
alter table 表名
add 欄位名 數據類型 [完整性約束條件…],
add 欄位名 數據類型 [完整性約束條件…];
3. 刪除欄位
alter table 表名
drop 欄位名;
4. 修改欄位
alter table 表名
modify 欄位名 數據類型 [完整性約束條件…];
alter table 表名
change 舊欄位名 新欄位名 舊數據類型 [完整性約束條件…];
alter table 表名
change 舊欄位名 新欄位名 新數據類型 [完整性約束條件…];
5.修改欄位排列順序/在增加的時候指定欄位位置
alter table 表名
add 欄位名 數據類型 [完整性約束條件…] first;
alter table 表名
add 欄位名 數據類型 [完整性約束條件…] after 欄位名;
alter table 表名
change 欄位名 舊欄位名 新欄位名 新數據類型 [完整性約束條件…] first;
alter table 表名
modify 欄位名 數據類型 [完整性約束條件…] after 欄位名;
6.去掉null約束
create table t(id int unique,name char(10) not null);
alter table t modify name char(10) null;
7.添加null約束
alter table t modify name char(10) not null;
8.去掉unique約束
alter table t drop index id;
9.添加unique約束
alter table t modify id int unique;
10.刪除表
drop table 表名;
"""
alter table 表名 modify 修改已經存在的欄位 的類型 寬度 約束
alter table 表名 change 修改已經存在的欄位 的類型 寬度 約束 和 欄位名字
alter table 表名 add 欄位名 數據類型(寬度) 約束 first/after name
alter table 表名 drop 欄位名
alter table 表名 modify name varchar(12) not null
alter table 表名 change name new_name varchar(12) not null
id name age
alter table 表名 modify age int not null after id;
alter table 表名 modify age int not null first;