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字段
"""

一對多(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;
相關文章
相關標籤/搜索