Day 39 约束 主键 外键

Day 39 约束 主键 外键

约束 constraint

约束是一种限制,数据库的约束就是对数据的安全性,完整性的保证.

mysql中的约束

  1. unique

    唯一性约束,表示这个字段不能出现重复的值,用于唯一标识一条记录

  2. not null

    非空约束,表示这个字段的值不能为空

  3. null

    一些数据类型默认是可以为空的

  4. default

    默认值,用于给某一个字段设置默认值

    #创建表student 名字(不为空) 性别(二选一默认为b) 学号(唯一)
    create table student(name char(20) not null, gender enum('g','b') default 'b',id int unique)
    > OK
    > 时间: 0.028s
    
    #name不能为空
    insert into student values(null,null,null)
    > 1048 - Column 'name' cannot be null
    > 时间: 0.001s
    
    insert into student values('zhujian',null,null)
    > Affected rows: 1
    > 时间: 0.004s
    
    insert into student (name,id) values('tom',123)
    > Affected rows: 1
    > 时间: 0.004s
    #修改id字段不为空
    alter table student modify id int unique not null
    
    
  5. primary key

    主键约束,从约束角度来看就等于非空+唯一

    在innodb存储引擎中,主键用于组织数据(属性结构),主键对于innodb引擎来说是必须的,如果没有手指定主键,myuusql会自动朝招一个具备非空且唯一的字段作为主键,如果也没有这样的字段,mysql会创建一个隐藏字段,作为主键,首先明确主键是一种索引,unique也是,索引的作用是加速查询,如果我们在查询语句中没有使用索引字段,mysql将无法为我们的查询加速,意味着如果没有主键将无法加速查询

    主键与普通的约束的区别:

    主键 具备约束他的作用,还能加快我们的查询速度,所以我们在创建表的是后都应该创建索引字段

    如果本来的业务中就存在非空且唯一的字段,那就把它设置为主键,如果没有就添加一个字段专门作为主键,通常我们会把主键设置为int'类型,是为了保证唯一性

    为主键设置自动增长 auto_increment

    当我们创建主键字段时,插入的数据必须是唯一的不能重复的,所以我们可以使用mysql有一个自动增长的属性,可以添加在整型字段上,每次插入数据时,都可以自动的插入值,并没每次加1不会冲突

    create table teacher(id int primary key auto_increment,name char(10));
    

表之间的关系

foreign key (强调:foreigin key是用来保证两张表之间的关联关系是正确的)

外键约束,用于指向另一个表的主键字段

create table dept(id int primary key auto_increment,name char(10))

create table teacher1(id int primary key auto_increment,name char(10),dept_id int,foreign key(dept_id) references dept(id)); #外键约束指向表dept的主键

#现有主表dept 再有从表teacher

foreign key带来的约束作用:

  1. 在从表中插入一条记录,关联了一个主表中不再存在的id 导致插入失败,必须保证外键的值必须是在主表中存在的

  2. 插入数据的顺序

    先插入主表的记录,再插入从表的记录

  3. 从表更新外键时也必须保证,外键的值在主表中是存在的

  4. 删除主表记录前,要保证从表中没有外键关联被删除的id,必须先删除从表.再删除主表

  5. 更新主表记录的主键时 ,要保证从表中没有外键关联被删除的id

  6. 必须先创建主表

  7. 删除表,必须先删除从表

级联操作 cascade

当我们需要删除部门(主表)信息时,必须先删除从表中关联的数据比较麻烦,级联操作就是指,当你操作主表时,自动操作从表

两种级联操作:

  1. 级联的删除

    当删除主表示自动删除从表中的相关数据

  2. 级联更新

    当主表的主键更新时自动更新关联的从表数据

drop table if exists class;
# 如果这个表存在才删除
create table class(id int primary key auto_increment,name char(20))


#创建表的时候指定级联操作(写在从表中)
create table students(
    id int primary key auto_increment,
    name char(20),
    class_id int,
    foreign key (class_id) references class(id)
    on update cascade	#级联更新
    on delete cascade	#级联删除
)

外键的使用

​ 什么时候使用外键:表之间存在关联关系

表之间关系

  1. 多对一(一对多)

    在多的一方保存另一方的主键

  2. 多对多

    如果双方都是一对多的关系,那么两者就是多对多的关系

    • 处理方式

      建立一个中间表,用于存储关系,至少具备两个字段分别为指向两个表的主键,两个字段都是外键

  3. 一对一关系

    站在两边看都是一对一的关系

    • 处理方式

      先确定先后顺序,将先存在的数据作为主表,后存在的作为从表,是两个表的ID保持一一对应

      ​ 方法1:从表的id集市住建又是外键

      ​ 方法2:从表的id设置为外键并保证唯一

posted @ 2019-07-13 10:42  萨萌萌  阅读(151)  评论(0编辑  收藏  举报