MySQL 表與表之間建立關系
阿新 • • 發佈:2019-05-14
ram 完整 str cascade 之間 字段名 auto 模塊 多對多
引子:如下圖是一張非常尋常的表格,在以前的工作中實常會制作類似的表格,但是今天的數據庫內容,將我之前這種傳統的制表思路上升了一個層次;
今天核心的內容就是怎樣讓表與表之間產生關系,在思考這個問題的時候,我們可以回顧之前學習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);
一對一
修改表
語法: 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 表與表之間建立關系