MYSQL--表與表之間的關係、修改表的相關操作
表與表之間的操作:
如果所有資訊都在一張表中:
1、表的結構不清晰
2、浪費硬碟空間
3、表的擴充套件性變得極差(致命的缺點)
確立表與表之間的關係。一定要換位思考(必須在兩者考慮清楚之後才能得出結論)
以員工和部門為例:
員工:一個員工只能對應一個部門
部門:一個部門同時包含了很多員工
結論:員工表和部門表之間僅僅是單向的多對一,所以他們的關係就是"多對一"
在表關係中沒有多對一一說,是說一對多,無論是一對多還是多對一,都叫"一對多"
如何讓兩張表在程式碼層面上產生真正的關聯。這時候就必須使用外來鍵:
外來鍵:讓表和表在硬性層面上產生關係
foreign key:外來鍵約束
1、在建立表的時候。必須先建立被關聯的表
2、在插入資料的時候。必須先插入被關聯表的資料
建表:
create table dep( id int primary key auto_increment, dep_name varchar(32), dep_desc varchar(128) ); create table emp( id int primary key auto_increment, emp_name varchar(64), emp_gender enum('male','female','others') default 'male', dep_id int, foreign key(dep_id) references dep(id) );
插入資料:
insert into dep(dep_name,dep_desc) values('外交部','搞外交'), ('教學部','教書育人'), ('技術部','技術能力有限部門') ; insert into emp(emp_name,dep_id) values('jason',1), ('egon',2), ('tank',2), ('kevin',3);
修改資料:
update dep set id=200 where id = 1; update emp set dep_id = 300 where id = 1; delete from dep where id = 3;
外來鍵雖然能夠幫你強制建立表關係。但是也會給表之間增加資料相關的約束
1、刪除資料的時候 先刪除員工表的資料 在刪除部門表的資料
delete from emp where id = 4; delete from dep where id = 3;
2、級聯更新級聯刪除
create table dep( id int primary key auto_increment, dep_name varchar(32), dep_desc varchar(128) ); create table emp( id int primary key auto_increment, emp_name varchar(64), emp_gender enum('male','female','others') default 'male', dep_id int, foreign key(dep_id) references dep(id) on update cascade on delete cascade ); insert into dep(dep_name,dep_desc) values('外交部','搞外交'), ('教學部','教書育人'), ('技術部','技術能力有限部門') ; insert into emp(emp_name,dep_id) values('jason',1), ('egon',2), ('tank',2), ('kevin',3); update dep set id=200 where id = 3; delete from dep where id = 2;
多對多:
例項:圖書與作者之間的關係
圖書:一本書能夠擁有多個作者
作者:一個作者能夠寫多本書
如果雙方都可以的話, 那麼這種關係就是多對多
強調:foreign key 只是用來幫你建立表關係的。不是某個關係特有的方法
1、先建立兩種普通的表。不需要設定外來鍵:
create table book( id int primary key auto_increment, title varchar(32), price int ); create table author( id int primary key auto_increment, name varchar(32), age int );
2、手動建立第三張表,用來專門記錄兩種表之間的關係
create table book2author( id int primary key auto_increment, book_id int, foreign key(book_id) references book(id) on update cascade on delete cascade, author_id int, foreign key(author_id) references author(id) on update cascade on delete cascade );
3、插入資料
insert into book(title,price) values('金瓶',199),('聊齋',299),('jason教你刪別人的庫,讓別人跑去吧',1); insert into author(name,age) values('jason',18),('tank',38); insert into book2author(book_id,author_id) values(4,3); # 報錯 insert into book2author(book_id,author_id) values(1,1),(1,2),(2,1),(3,1),(3,2);
一對一的建表關係:
1、一對一主要用在當你的表特別龐大,這時候你就可以考慮將這個表拆分開來
可以聯想到客戶和學生
create table authordetail1( id int primary key auto_increment, phone int, addr char(255) ); create table author1( id int primary key auto_increment, name char(4), age int, authordetail_id int unique, foreign key(authordetail_id) references authordetail1(id) on update cascade on delete cascade );
總結:通常將關係欄位稱之為外來鍵欄位
一對多的外來鍵欄位 建在多的一方
多對多 建在第三張表
一對一 外來鍵欄位可以在任意一方(但是推薦你建在查詢頻率比較高的一方)
修改表的相關操作:
1、修改表名稱 ALTER TABLE 表名 RENAME 新表名; 2、增加欄位 ALTER TABLE 表名 ADD 欄位名 資料型別 [完整性約束條件…]; ALTER TABLE 表名 ADD 欄位名 資料型別 [完整性約束條件…] FIRST; # 直接移到最前面 ALTER TABLE 表名 ADD 欄位名 資料型別 [完整性約束條件…] AFTER 欄位名; # 尋找插哪個欄位的後面 3、刪除欄位 ALTER TABLE 表名 DROP 欄位名; 4、修改欄位 # modify只能改欄位資料型別完整約束,不能改欄位名,但是change可以! ALTER TABLE 表名 MODIFY 欄位名 資料型別 [完整性約束條件…]; ALTER TABLE 表名 CHANGE 舊欄位名 新欄位名 新資料型別 [完整性約束條件…];
複製表:
# 查詢語句執行的結果也是一張表,可以看成虛擬表 # 複製表結構+記錄 (key不會複製: 主鍵、外來鍵和索引) create table new_service select * from service; # 只複製表結構 select * from service where 1=2; //條件為假,查不到任何記錄 create table new1_service select * from service where 1=2; create table t4 like employees;
&n