外鍵
前戲之一對多關係
# 定義一張部門員工表 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字段 """一對多(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); # 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,區別在於如何使用以及其餘條件限制便可作出三種關係修改表
語法: 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不會複製: 主鍵、外鍵和索引) 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;