mysql數據庫之表關係

外鍵

前戲之一對多關係

# 定義一張部門員工表
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 舊字段名 新字段名 新數據類型 [完整性約束條件…];

複製表

# 查詢語句執行的結果也是一張表,能夠當作虛擬表

# 複製表結構+記錄 (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;
相關文章
相關標籤/搜索