表與表之間建立關系
阿新 • • 發佈:2019-05-14
emp 就是 key) ice 虛擬表 des server rst p s
將所有的數據都放在一張表內產生弊端:
1 表的組織結構不清晰
2 浪費存儲空間
3 可擴展性極差(修改某一個部門的信息的時候~)
類似於所有代碼都寫在一個py文件,如何優化?
解耦拆分
如何查找表與表之間的關系
以員工和部門表為例。查找表關系需要做到換位思考(站在兩邊去找表關系)
1 先站在員工表:
找員工表的多條數據能否對應部門表的一條數據
翻譯:多個員工能否屬於一個部門
可以 之後不能直接下結論,還需要站在部門表的角度再確認關系
2 再站在部門表:
找部門表的多條數據能夠對應員工表的一條數據 (人為限制一個部門只能有一個相同員工)
翻譯:多個部門能否有同一個員工
不能
只有站在兩邊表的角度都分析過了,才能夠下結論:員工表 單向 多對一部門表
多對一
外鍵(foreign key) 1 必須要先建立被關聯表 create table dep(id int primary key auto_increment, dep_name char(16) , dep_desc char(16));
create table emp (id int primary key auto_increment ,name char(16), gender enum(‘male‘,‘female‘,‘others‘) not null default ‘male‘ ,dep_id int , foregin key(dep_id) references dep(id)); #default 後面的默認值空格直接書寫即可
2 插入數據 新增數據的時候,要先增被關聯表中的數據 insert into dep(dep_name,dep_desc) values (‘外交部‘,‘形象代言人‘), (‘教學部‘,‘教書育人‘), (‘技術部‘,‘技術能力有限部門‘); insert into emp(name,gender,dep_id) values (‘jason‘,‘male‘,1), (‘egon‘,‘male‘,2), (‘kevin‘,‘male‘,2), (‘tank‘,‘male‘,2), (‘jerry‘,‘female‘,3); 3 修改emp表中的dep_id字段 update emp set dep_id=100 where id=1; uptate dep set id =100 where id=1; delete from dep where id=2; delete from emp where id >1 and id <5; delete from dep where id=2;
給外鍵字段新增功能 同步更新 同步刪除 (級聯刪除 級聯更新)
create table dep( id int primayr key auto_increment , dep_name char(16), dep_desc char(64)); create table emp(id int primary key auto_increment, name char(16), gender enum(‘male,‘female‘,‘others‘) not null default ‘male‘, dep_id int, foreign key(dep_id) references dep(id) on update cascade #同步更新 on delete cascade #同步刪除 ); insert into emp (name ,gender ,dep_id) values (‘jason‘,‘male‘,1), (‘egon‘,‘male‘,2), (‘kevin‘,‘male‘,2), (‘tank‘,‘male‘,2), (‘jerry‘,‘female‘,3); uptate dep set id =100 where id=2; delete from dep where id=100;
多對多
圖書與作者 #create table book(id int primary key auto_increment, title char(16), price int, author_id int, foreign key(author_id) references author (id)); #create table author (id int primary key auto_increment, name char(16), gender char(16), book_id int, foreign key(book_id ) references book(id)); create table book(id int primary key auto_increment, title char(16), price int); create table author (id int primary key auto_increment, name char(16), gender char(16)); create table book2author (id int primary key auto_increment, book_id int, author_id int, foreign key(book_id) references book(id) on update cascade #同時更新 on delete cascade, #同時刪除 foreign key(author_id) references author(id) on update cascade #同步更新 on delete cascade #同步刪除 ); insert into book(title ,price) values (‘小王子‘,‘69.96‘),(‘圍城‘,‘99.99‘),(‘python全站開發‘,‘21000‘); insert into author (name ,gender) values (‘jason‘,‘male‘), (‘egon‘,‘female‘), (‘kevin‘,‘male‘); insert into book2author (book_id ,author_id) values (1,1), (1,2), (1,3), (2,1), (2,3), (3,1), (3,2);
一對一
用戶信息 客戶學生 user name password msg gender phone addr hobby.... create table customer(id int primary key auto_increment, name char(20) not null, qq char(11) not null, phone char(16) not null); create table sudent(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 update cascade on delete 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 舊字段名 新字段名 新數據類型 [完整性約束條件];
復制表
查詢語句執行的結果也是一張表,可以看成虛擬表 復制表結構 +記錄 (key不會復制:主鍵,外鍵和索引) create table new_server select * from server; 復制表結構 (key不會復制:主鍵,外鍵和索引)
select * from server where 1=2; #條件為假,查不到任何記錄 create table new1_server select * from server where 1=2;
表與表之間建立關系