表与表之间建立关系

将所有的数据都放在一张表内产生弊端:

  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;

猜你喜欢

转载自www.cnblogs.com/lakei/p/10863398.html
今日推荐