1. 程式人生 > >MySQL 表與表之間建立關系

MySQL 表與表之間建立關系

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 表與表之間建立關系