1. 程式人生 > >MYSQL--表與表之間的關係、修改表的相關操作

MYSQL--表與表之間的關係、修改表的相關操作

表與表之間的操作:

  如果所有資訊都在一張表中:

    1、表的結構不清晰

    2、浪費硬碟空間

    3、表的擴充套件性變得極差(致命的缺點)

    確立表與表之間的關係。一定要換位思考(必須在兩者考慮清楚之後才能得出結論)

  以員工和部門為例:

    員工:一個員工只能對應一個部門

    部門:一個部門同時包含了很多員工

  結論:員工表和部門表之間僅僅是單向的多對一,所以他們的關係就是"多對一"

  在表關係中沒有多對一一說,是說一對多,無論是一對多還是多對一,都叫"一對多"

  如何讓兩張表在程式碼層面上產生真正的關聯。這時候就必須使用外來鍵:

  外來鍵:讓表和表在硬性層面上產生關係

    foreign key:外來鍵約束

      1、在建立表的時候。必須先建立被關聯的表

      2、在插入資料的時候。必須先插入被關聯表的資料

  建表:

create table dep(
            id int primary key auto_increment,
            dep_name varchar(32),
            dep_desc varchar(128)
        );
        
create table emp(
            id int primary key auto_increment,
            emp_name varchar(64),
            emp_gender enum('male','female','others') default 'male',
            dep_id int,
            foreign key(dep_id) references dep(id)    
        );

 

 

  插入資料:

insert into dep(dep_name,dep_desc) values('外交部','搞外交'),
        ('教學部','教書育人'),
        ('技術部','技術能力有限部門')
        ;
        
        
insert into emp(emp_name,dep_id) values('jason',1),
         ('egon',2),
         ('tank',2),
         ('kevin',3);

 

  

  修改資料:

    update dep set id=200 where id = 1;
    update emp set dep_id = 300 where id = 1;
        
    delete from dep where id = 3;

 

 

  外來鍵雖然能夠幫你強制建立表關係。但是也會給表之間增加資料相關的約束

  1、刪除資料的時候 先刪除員工表的資料 在刪除部門表的資料

    delete from emp where id = 4;
    delete from dep where id = 3;

 

  2、級聯更新級聯刪除

     create table dep(
                id int primary key auto_increment,
                dep_name varchar(32),
                dep_desc varchar(128)
            );
        
        
        create table emp(
                id int primary key auto_increment,
                emp_name varchar(64),
                emp_gender enum('male','female','others') default 'male',
                dep_id int,
                foreign key(dep_id) references dep(id) 
                on update cascade 
                on delete cascade
            );

            
        insert into dep(dep_name,dep_desc) values('外交部','搞外交'),
            ('教學部','教書育人'),
            ('技術部','技術能力有限部門')
            ;
            
            
        insert into emp(emp_name,dep_id) values('jason',1),
            ('egon',2),
            ('tank',2),
            ('kevin',3);
    
        update dep set id=200 where id = 3;
        delete from dep where id = 2;

 

  多對多:

    例項:圖書與作者之間的關係

      圖書:一本書能夠擁有多個作者

      作者:一個作者能夠寫多本書

    如果雙方都可以的話, 那麼這種關係就是多對多

  強調:foreign key 只是用來幫你建立表關係的。不是某個關係特有的方法

  1、先建立兩種普通的表。不需要設定外來鍵:

        create table book(
                id int primary key auto_increment,
                title varchar(32),
                price int
            );
        create table author(
                id int primary key auto_increment,
                name varchar(32),
                age int
            );            

 

 

  2、手動建立第三張表,用來專門記錄兩種表之間的關係

create table book2author(
                id int primary key auto_increment,
                book_id int,
                foreign key(book_id) references book(id)
                on update cascade
                on delete cascade,
                author_id int,
                foreign key(author_id) references author(id)
                on update cascade
                on delete cascade
        );

 

 

  3、插入資料

insert into book(title,price) values('金瓶',199),('聊齋',299),('jason教你刪別人的庫,讓別人跑去吧',1);
        
        
        insert into author(name,age) values('jason',18),('tank',38);
        
        
        insert into book2author(book_id,author_id) values(4,3);  # 報錯
        insert into book2author(book_id,author_id) values(1,1),(1,2),(2,1),(3,1),(3,2);

 

 

  一對一的建表關係:

    1、一對一主要用在當你的表特別龐大,這時候你就可以考慮將這個表拆分開來

    可以聯想到客戶和學生

create table authordetail1(
            id int primary key auto_increment,
            phone int,
            addr char(255)
    
    );
    
    create table author1(
        id int primary key auto_increment,
        name char(4),
        age int,
        authordetail_id int unique,
        foreign key(authordetail_id) references authordetail1(id)
        on update cascade
        on delete cascade
    );

 

 

  總結:通常將關係欄位稱之為外來鍵欄位 

    一對多的外來鍵欄位 建在多的一方
    多對多 建在第三張表
    一對一 外來鍵欄位可以在任意一方(但是推薦你建在查詢頻率比較高的一方)

 

 

修改表的相關操作:

1、修改表名稱
    ALTER TABLE 表名 RENAME 新表名;
2、增加欄位
    ALTER TABLE 表名 ADD 欄位名  資料型別 [完整性約束條件…];
    ALTER TABLE 表名 ADD 欄位名  資料型別 [完整性約束條件…]  FIRST;  # 直接移到最前面
    ALTER TABLE 表名 ADD 欄位名  資料型別 [完整性約束條件…]  AFTER 欄位名;  # 尋找插哪個欄位的後面 
3、刪除欄位
    ALTER TABLE 表名 DROP 欄位名;
4、修改欄位  # modify只能改欄位資料型別完整約束,不能改欄位名,但是change可以!
    ALTER TABLE 表名 MODIFY  欄位名 資料型別 [完整性約束條件…];
    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;

 

 

 

 

 

 

 

 

&n