mysql如何让表建立连接吗_MySQL 表与表之间建立关系
引子:如下圖是一張非常尋常的表格,在以前的工作中實常會制作類似的表格,但是今天的數據庫內容,將我之前這種傳統的制表思路上升了一個層次;
今天核心的內容就是怎樣讓表與表之間產生關系,在思考這個問題的時候,我們可以回顧之前學習python時,當一個任務涉及到很多的功能時,我們為了
讓程序的結構更清晰,擴展性更高,我們選擇用函數>>模塊>>包 的方式將功能層層拆分,最終讓程序結構上升到新的層次,而且極大的降低了代碼的冗
余。再回到這張表,如果說總共就這幾個人,這張表沒什么問題,但是假設我們擁有100w的用戶,此時表中的 def_name,dep_desc就有些冗余了;此外
這種表的形式也非常不利于后期數據的取值和修改。
實現思路:把內容多出現重復的字段拎出來制作成具有id的新表,將兩張表建立聯系。
一對多
第一步 拆分表
第二步 建立關聯(通過dep_id字段鏈接兩張表)
注意:1.必選要先建被關聯表;
2.新增數據的時候,要先增被關聯表中的數據;
create table dep(
id int primary key auto_increment,#id設置為主建,自增
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', #default后面的默認值空格直接書寫即可
dep_id int,
foreign key(dep_id) references dep(id)#外鍵 本表中的dep_id 字段 ,關聯dep表中的id字段;
);
插入數據
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);
修改dep_id 數據
update emp set dep_id=100 where id=1; #修改dep_id數據 結果報錯。
但我們可以選擇先刪除關聯表中的數據后,再更改與其關聯表emp中的字段。但這
并不是最好的解決辦法
第三步 深度關聯(修改/刪除同步)on update cascade on delete cascade
create table dep(
id int primary 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', #default后面的默認值空格直接書寫即可
dep_id int,
foreign key(dep_id) references dep(id)
on update cascade#同步更新
on delete cascade #同步刪除
);
多對多(第三張表牽線搭橋)
當我們面對的是兩張表互相之間都是多對一的情況,也就是多對多的情況時,就會出現互為外鍵,如果還是安裝上面的方法創建,就會出現無法創建表的情況。此時我們需要第三張表來作為中間人,
為兩張表牽線搭橋,讓它們產生關聯。
書與作者案例
多對多案例實現
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);
一對一
客戶表和學生表(老男孩的客戶與學生之間,報名之前都是客戶,只有報了名的才能是學生)
#左表的一條記錄唯一對應右表的一條記錄,反之也一樣
create table customer(
id int primary key auto_increment,
name char(20) notnull,
qq char(10) notnull,
phone char(16) notnull
);
create table student(
id int primary key auto_increment,
class_name char(20) notnull,
customer_id int unique,#該字段一定要是唯一的
foreign key(customer_id) references customer(id) #外鍵的字段一定要保證unique
on delete cascade
on update cascade
);
修改表
語法:
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;
總結
以上是生活随笔為你收集整理的mysql如何让表建立连接吗_MySQL 表与表之间建立关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sqlserver慕课_SqlServe
- 下一篇: 如何用自己的路由器连接别人家的wifi如