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

表與表之間建立關系

emp 就是 key) ice 虛擬表 des server rst p s

將所有的數據都放在一張表內產生弊端:

  1 表的組織結構不清晰

  2 浪費存儲空間

  3 可擴展性極差(修改某一個部門的信息的時候~)

 類似於所有代碼都寫在一個py文件,如何優化?

  解耦拆分

如何查找表與表之間的關系

以員工和部門表為例。查找表關系需要做到換位思考(站在兩邊去找表關系)

  1 先站在員工表:

    找員工表的多條數據能否對應部門表的一條數據

    翻譯:多個員工能否屬於一個部門

    可以 之後不能直接下結論,還需要站在部門表的角度再確認關系

  2 再站在部門表:

    找部門表的多條數據能夠對應員工表的一條數據 (人為限制一個部門只能有一個相同員工)

    翻譯:多個部門能否有同一個員工

    不能

只有站在兩邊表的角度都分析過了,才能夠下結論:員工表 單向 多對一部門表

多對一

外鍵(foreign key)

1 必須要先建立被關聯表
create table dep(id int primary key auto_increment, dep_name char(16) , dep_desc char(16));

技術分享圖片 create table emp (id int primary key auto_increment ,name char(
16), gender enum(male,female,
others) not null default male ,dep_id int , foregin key(dep_id) references dep(id)); #default 後面的默認值空格直接書寫即可
技術分享圖片
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); 3 修改emp表中的dep_id字段 update emp set dep_id=100 where id=1; uptate dep set id =100 where id=1; delete from dep where id=2; delete from emp where id >1 and id <5; delete from dep where id=2;

給外鍵字段新增功能 同步更新 同步刪除 (級聯刪除 級聯更新)

create table dep( id int primayr 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,
                        dep_id int,
                        foreign key(dep_id) references dep(id) 
                        on update cascade #同步更新
                        on delete cascade #同步刪除
);

insert into emp (name ,gender ,dep_id) values 
(jason,male,1),
(egon,male,2),
(kevin,male,2),
(tank,male,2),
(jerry,female,3);


uptate dep set  id =100 where id=2;
delete from dep where id=100;

多對多

圖書與作者
#create table book(id int primary key auto_increment,
                           title char(16),
                           price int,
                           author_id int,
                           foreign key(author_id) references author (id));

#create table author (id int primary key auto_increment,
                        name char(16),
                        gender char(16),
                        book_id int,
                        foreign key(book_id ) references book(id));


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);

一對一

用戶信息  客戶學生
user name password   msg gender phone addr hobby....

create table customer(id int primary key auto_increment,
        name char(20) not null,
        qq char(11) not null,
        phone char(16) not null);

create table sudent(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 update cascade
    on delete cascade);
 
#三種外鍵關系都是用foreign key,區別在於如何使用以及其他條件限制即可做出三種關系

書籍和作者

一本書可以不可以被多個作者寫   可以  

一個作者可不可以寫多本書    可以

多對對關系

書籍和出版社(出版社出了書其他出版社就不出版)

一本書出版社可以不可以被多個出版社出版  不可以

一個出版社可不可以出版多本書       可以

一對多關系

作者與作者簡介

兩個不可以就是

一對一

mysql中不識別大小寫的

語法:
    1 修改表名
        alter table 表名    rename 新表名;

    2 增加字段
        alter table 表名  add 字段名 數據類型 [完整性約束條件],
                    add 字段名 數據類型 [完整性約束條件];

        alter table 表名  add 字段名 數據類型 [完整性約束條件] first; 
            #把增加的字段放在表的最前面
    
        alter table 表名  add 字段名  數據類型 [完整性約束條件]  after 字段名;
        #把增加的字段放在哪個字段後面
    
    3 刪除字段
        alter table 表名 drop 字段名;

    4 修改字段  #modify只能改字段數據類型完整約束,不能改字段名,但是change可以!
        alter table 表名  modify 字段名 數據類型 [完整性約束條件];

        alter table  表名  change  舊字段名  新字段名 舊數據類型 [完整性約束條件];
    
        alter table 表名  change  舊字段名  新字段名 新數據類型 [完整性約束條件];

復制表

查詢語句執行的結果也是一張表,可以看成虛擬表

復制表結構 +記錄 (key不會復制:主鍵,外鍵和索引)

    create table new_server select * from server;


復制表結構 (key不會復制:主鍵,外鍵和索引)
 select * from server where 1=2; #條件為假,查不到任何記錄  create table new1_server select * from server where 1=2;

表與表之間建立關系