外鍵
前戲之一對多關係
# 定義一張部門員工表 id name gender dep_name dep_desc 1 jason male 教學部 教書育人 2 egon male 外交部 漂泊遊蕩 3 tank male 教學部 教書育人 4 kevin male 教學部 教書育人 5 owen female 技術部 技術能力有限部門 """ 把全部數據都存放於一張表的弊端 1.組織結構不清晰 2.浪費硬盤空間 3.擴展性極差 """ # 上述的弊端產生緣由相似於把代碼所有寫在一個py文件中,你應該怎麼作?>>>解耦合!將上述一張表拆成員工和部門兩張表! # 相似的表關係學生與班級,也是如此,一張學生表和一張班級表 # 分析表數據之間的關係:多個用戶對應一個部門,一個部門對應多個用戶。禁止一個用戶對應多個部門這種狀況是另一張表關係 # 如何查找表與表之間的關係 """ 老師與課程表 1.站在老師表的角度:一名老師可否教授多門課程(限制死,不能,一名老師只能教python,不能同時教python和linux) 2.站在課程表的角度:一門課程可否能夠被多個老師教,徹底能夠! 那就是課程表多對一老師表,如何表示這種關係?在課程表中建立一個字段(tea_id)指向老師表的id字段 學生與班級表 1.站在學生表的角度:??? 2.站在班級表的角度:??? 那就是學生表多對一班級表,如何表示這種關係?在學生表中建立一個字段(class_id)指向班級表的id字段 """ # 再回過頭來看員工與部門表,我員工表裏面的dep_id我能夠隨意更改,可是應該有一個強制限制,限制dep_id字段必須只是部門表已有的id字段才合理
一對多(Foreign Key)
# foreign key會帶來什麼樣的效果? # 一、在建立表時,先建被關聯的表dep,才能建關聯表emp create table dep( id int primary key auto_increment, dep_name char(10), dep_comment char(60) ); create table emp( id int primary key auto_increment, name char(16), gender enum('male','female') not null default 'male', dep_id int, foreign key(dep_id) references dep(id) ); # 二、在插入記錄時,必須先插被關聯的表dep,才能插關聯表emp insert into dep(dep_name,dep_comment) values ('sb教學部','sb輔導學生學習,教授python課程'), ('外交部','老男孩上海校區駐張江形象大使'), ('nb技術部','nb技術能力有限部門'); insert into emp(name,gender,dep_id) values ('alex','male',1), ('egon','male',2), ('lxx','male',1), ('wxx','male',1), ('wenzhou','female',3); # 當我想修改emp裏的dep_id或dep裏面的id時返現都沒法成功 # 當我想刪除dep表的教學部的時候,也沒法刪除 # 方式1:先刪除教學部對應的全部的員工,再刪除教學部 # 方式2:受限於外鍵約束,致使操做數據變得很是複雜,可否有一張簡單的方式,讓我不須要考慮在操做目標表的時候還須要考慮關聯表的狀況,好比我刪除部門,那麼這個部門對應的員工就應該跟着當即清空 # 先把以前建立的表刪除,先刪員工表,再刪部門表,最後按章下面的方式從新建立表關係 # 3.更新於刪除都須要考慮到關聯與被關聯的關係>>>同步更新與同步刪除 create table dep( id int primary key auto_increment, dep_name char(10), dep_comment char(60) ); create table emp( id int primary key auto_increment, name char(16), gender enum('male','female') not null default 'male', dep_id int, foreign key(dep_id) references dep(id) on update cascade on delete cascade ); insert into dep(dep_name,dep_comment) values ('sb教學部','sb輔導學生學習,教授python課程'), ('外交部','老男孩上海校區駐張江形象大使'), ('nb技術部','nb技術能力有限部門'); insert into emp(name,gender,dep_id) values ('alex','male',1), ('egon','male',2), ('lxx','male',1), ('wxx','male',1), ('wenzhou','female',3); # 刪除部門後,對應的部門裏面的員工表數據對應刪除 # 更新部門後,對應員工表中的標示部門的字段同步更新
多對多
# 圖書表與做者表之間的關係 """ 仍然站在兩張表的角度: 1.站在圖書表:一本書可不能夠有多個做者,能夠!那就是書多對一做者 2.站在做者表:一個做者可不能夠寫多本書,能夠!那就是做者多對一書 雙方都能一條數據對應對方多條記錄,這種關係就是多對多! """ # 先來想如何建立表?圖書表須要有一個外鍵關聯做者,做者也須要有一個外鍵字段關聯圖書。問題來了,先建立誰都不合適!如何解決? # 創建第三張表,該表中有一個字段fk左表的id,還有一個字段是fk右表的id create table author( id int primary key auto_increment, name char(16) ); create table book( id int primary key auto_increment, bname char(16), price int ); insert into author(name) values ('egon'), ('alex'), ('wxx') ; insert into book(bname,price) values ('python從入門到入土',200), ('葵花寶典切割到精通',800), ('九陰真經',500), ('九陽神功',100) ; create table author2book( id int primary key auto_increment, author_id int, book_id int, foreign key(author_id) references author(id) on update cascade on delete cascade, foreign key(book_id) references book(id) on update cascade on delete cascade ); insert into author2book(author_id,book_id) values (1,3), (1,4), (2,2), (2,4), (3,1), (3,2), (3,3), (3,4);
一對一
客戶表和學生表(老男孩的客戶與學生之間,報名以前都是客戶,只有報了名的才能是學生)python
# 左表的一條記錄惟一對應右表的一條記錄,反之也同樣 create table customer( id int primary key auto_increment, name char(20) not null, qq char(10) not null, phone char(16) not null ); create table student( id int primary key auto_increment, class_name char(20) not null, customer_id int unique, #該字段必定要是惟一的 foreign key(customer_id) references customer(id) #外鍵的字段必定要保證unique on delete cascade on update cascade ); # 三種外鍵關係都是用foreign key,區別在於如何使用以及其餘條件限制便可作出三種關係
小總結
一般將關係字段 稱之爲 外鍵字段 一對多將外鍵放於多的中 多對多外鍵放於第三張表中 一對一外鍵能夠放於任何一方 可是推薦建在查詢頻率較高的一方
好比: 用戶基本信息和用戶詳細信息這是兩張表且他們是一對一關係 此時外鍵就要放於用戶基本信息這張表中
修改表
# mysql對大小寫不敏感!!! 語法: 1. 修改表名 ALTER TABLE 表名 RENAME 新表名; 2. 增長字段 ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件…], ADD 字段名 數據類型 [完整性約束條件…]; ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件…] FIRST; ALTER TABLE 表名 ADD 字段名 數據類型 [完整性約束條件…] AFTER 字段名; 3. 刪除字段 ALTER TABLE 表名 DROP 字段名; 4. 修改字段 # modify只能改字段數據類型完整約束,不能改字段名,可是change能夠! ALTER TABLE 表名 MODIFY 字段名 數據類型 [完整性約束條件…]; ALTER TABLE 表名 CHANGE 舊字段名 新字段名 舊數據類型 [完整性約束條件…]; ALTER TABLE 表名 CHANGE 舊字段名 新字段名 新數據類型 [完整性約束條件…];
複製表mysql
# 查詢語句執行的結果也是一張表,能夠當作虛擬表 # 複製表結構+記錄 (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;