MySQL >>> 表的操作二
今日内容:
外键、表关系、修改表的完整语句、复制表
问题的发现:
首先定义一张部门员工表:
     
  发现:把所有数据都存放于一张表的 弊端
     1. 组织结构不清晰                 没有突出重点
     2. 浪费硬盘空间                    dep_name 多个重复
     3. 扩展性极差                       增加内容不易
解决方案:
拆 !!!
如何拆 ???
首先要判断表与表之间的关系:一定要 换位思考 (必须两方都考虑周全之后才能得出结论) 然后再拆
##########################################################
        判断表关系的最简单的语法:
            ^_^  一个    可不可以   的故事  ^_^
         图书与出版社:
               一本书可不可以有多个出版社       不可以!!!
               一个出版社可不可以出版多本书    可以!!!
                   一对多 的关系: 表关系中没有 多对一 一说,只有一对多     (无论是多对一还是一对多都叫"一对多")
            图书与作者:
               一本书可不可以有多个作者     可以!!!
               一个作者可不可以写多本书     可以!!!
                   多对多 的关系
            作者与作者详情:
               一个作者可不可以有多个详情             不可以!!!
               一个作者详情可不可以有多个作者        不可以!!!
                    要么两者是 一对一
                    要么两者之间 没任何关系
##########################################################
此外:让两张表有代码层面上真正的关联,就必须使用 外键
外键
作用:让表与表有硬性层面上的关系
关键词:foreign key 会限制输入内容必须在被关联表的范围内
使用外键有一定的约束:
1. 在创建表的时候 必须先创建被关联表
2. 插入数据的时候 也必须先插入被关联表的数据
三种外键关系都是用 foreign key,区别在于 如何使用 以及 其他条件限制 即可做出三种关系
通常将关系字段称之为:外键字段
1.表与表之间的三种关系
1.1 一对一 外键字段 建在 任意一方 都可以 但是推荐你建在查询频率较高的一方
使用场景:表特别庞大的时候,可以考虑拆分表
关联表 内的一条记录 唯一对应 被关联表 的一条记录,反之也一样
创建表:先建被关联的表 !!!
被关联表
      create table customer(
           id int primary key auto_increment,
           name char(20) not null,
           qq char(10) not null,
           phone char(16) not null
         );
      create table student(
           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 delete cascade    级联删除
           on update cascade    级联更新
          );
        
1.2 一对多 一对多的外键字段 建在多的一方
关联表 内的一条记录 唯一对应被关联表 的一条记录,被关联表 内的一条记录 对应关联表 的多条记录
创建表:先创建被关联的表 !!!
被关联表
id int primary key auto_increment,
dep_name char(10),
dep_comment char(60)
);
id int primary key auto_increment,
name char(16),
gender enum('male','female') not null default 'male',
dep_id int,
foreign key(dep_id) references dep(id)
on update cascade
on delete cascade
);
1.3 多对多 多对多 建在第三张表
关联表 内的一条记录 对应被关联表 的多条记录,被关联表 内的一条记录 对应关联表 的多条记录
多对多关系的建立,必须手动创建 第三张表,用来专门记录两张表之间的关系
创建表:先创两张表,再创被关联表
被关联表
id int primary key auto_increment,
name char(16)
);
id int primary key auto_increment,
name char(16),
price int
);
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
);
2. 修改表的完整语句
2.1 修改表名
alter table 表名 rename 新表名;
2. 2 增加字段
      
alter table 表名 add 字段名 数据类型[完整性约束条件...],
                  add 字段名 数据类型[完整性约束条件...];
       alter table 表名 add 字段名 数据类型[完整性约束条件...]  first;                  # 直接移到最前面
       alter table 表名 add 字段名 数据类型[完整性约束条件...] after 字段名;       # 寻找插哪个字段的后面                    
2.3 删除字段
      
alter table 表名 drop 字段名;
2. 4 修改字段
      alter table 表名 modify 字段名 数据类型[完整约束条件...];
              # modify 只能改字段数据类型完整约束,不能改字段名,但是change可以!
      alter table 表名 change 旧字段名 新字段名 新数据类型[完整约束条件...];
         
语句:create table 新表名 select * from 旧表名;
                    
                
                
            
        
浙公网安备 33010602011771号