数据库的约束

  • 约束的介绍和作用

    1:约束条件和数据类型一样,都是可选参数
    2:约束条件的作用是用于数据的完整性,和数据的一致性
    
  • 主键与常见约束(************)

    1:unsigned 无符号的,只对数字有效
    2:not null 非空约束  (是否允许为空,默认NULL,可设置NOT NULL,字段不允许为空,必须赋值)
        #create table t1(name char(10) not null);
    3:unique 唯一约束(标识该字段的值是唯一的)
        #create table t1(name char(10) unique);
    4:anto_increment 自动增加(标识该字段的值自动增长(整数类型,而且为主键))
        #create table t1(id int primary key auto_increment); 前面必须是个主键key
    5:primary key 主键约束,第一个使用not null和unique的字段就会变成主键
        #create table t1(id int primary key);
    6:default 默认值(字段是否有默认值,缺省的默认值是NULL,如果插入记录时不给字段赋值,此字段使用默认值)
        #create table t1(name char(10) not null default 'xx');
    
  • 外键 foreign key references

    • foreign key外键介绍

      1:外键就是标明表与表之间的关系
      2:表与表之间的关系有三种:一对一.一对多.多对多
      3:级联关系
          #严格模式(默认的),外键有强制约束效果,被关联字段不能随意删除和修改
          #外键有强制约束效果,被关联字段删除或者修改,关联他的那么字段数据会随之删除或者	修改
          on update cascade , on delete cascade 级联更新和删除
          #set null模式: 被关联字段删除时,关联他的字段数据会置成null
      #级联set null的示例
      mysql> create table tt2(id int primary key auto_increment,name char(10));
      
      mysql> create table tt3(id int,pid int,foreign key(pid) references tt2(id) on delete set null);
      Query OK, 0 rows affected (1.06 sec)
      
      mysql> desc tt3;
      +-------+---------+------+-----+---------+-------+
      | Field | Type    | Null | Key | Default | Extra |
      +-------+---------+------+-----+---------+-------+
      | id    | int(11) | YES  |     | NULL    |       |
      | pid   | int(11) | YES  | MUL | NULL    |       |
      +-------+---------+------+-----+---------+-------+
      2 rows in set (0.01 sec)
      
      mysql> insert into tt2(name) values('xx1'),('xx2');
      Query OK, 2 rows affected (0.14 sec)
      Records: 2  Duplicates: 0  Warnings: 0
      
      mysql> insert into tt3 values(1,1),(2,1);
      Query OK, 2 rows affected (0.12 sec)
      Records: 2  Duplicates: 0  Warnings: 0
      
      mysql> select * from tt3;
      +------+------+
      | id   | pid  |
      +------+------+
      |    1 |    1 |
      |    2 |    1 |
      +------+------+
      2 rows in set (0.00 sec)
      
      mysql> delete from tt2 where id = 1;
      Query OK, 1 row affected (0.10 sec)
      
      mysql> select * from tt3;
      +------+------+
      | id   | pid  |
      +------+------+
      |    1 | NULL |
      |    2 | NULL |
      +------+------+
      2 rows in set (0.00 sec)
      
    • 外键的作用

      1:使表的组织结构变得清晰
      2:节省空间
      3:增强扩展性
      4:保证了数据的安全性和逻辑性
      ===========
      约束作用:
          1:先要建立被关联的表,才能建立关联表
          2:再插入数据的时候,要先往被关联表中插入数据,才能往关联表中插入数据
          3:更新或者删除的时候都要考虑关联表和被关联表的关系
      
    • 一对多的关系

      1:create table dep(id int primary key auto_increment,dep_name char(16) not null);#创建部门表(被关联的表)
      2:create table emp(id int primary key auto_increment,name char(10) not null,dep_id int, foreign key(dep_id) references dep(id))#员工表(关联表)
      ================================
      '''
      创建表时,先创建被关联的表,因为关联表中外键的字段数据事来自与被关联的表中的字段,否则就会报错,再插入数据时,也是先再被关联的表中创建数据,先在关联表中创建数据的话,外键是没有值得这样也报错,在修改删除数据时,而是先删除关联表的数据,如果先删除被关联表中的数据,就会报错,原因一样,在关联表中,这个数据被关联着,是无法删除的
      
      有一个解决方案是可以在被关联表中添加两个方法,做到被关联表更新和删除的操作的时候,关联表中同步更新和删除的效果,在申明外键的时候,在后面加上两句话
      1:on delete cascade 删除同步
      2:on update cascade 更新同步
      '''
      
    • 多对多的关系

      1:create table author(id int primary key auto_increment,name char(16) not null);#表一
      2:create table blook(id int primary key auto_increment,bname char(16) not null);#表二
      3:create table author_blook(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);#中间表
      '''
      中间表需要指定两个外键,来关联两个表
      '''
      多对多的关系,可以查看博客:https://www.cnblogs.com/clschao/articles/9968396.html#_label6
      
    • 一对一的关系

      1:create table customer(id int primary key auto_increment,name char(16) not null,phone char(11) not null unique ,qq char(15) not null unique);#表一
      2:create table student(id int primary key auto_increment,name char(10) not null , class_name char(15) not null,cid int unique,foreign key(cid) references customer(id));#表二
      '''
      一对一的状态下,被关联的字段中的数据只能在关联表中关联一次,所有我们把关联的字段设置成unique 唯一的,这样就不会出现重复的
      '''
      
    • 对于查看表关系的总结

      #查看表关系的步骤:
      1:先从左表的角度去找(条件一)
          是否左表的多条记录可以对应右表的一条记录,则证明左表中有一个外键对应右表的一个		字段
      2:先从右表的角度去找(条件二)
          是否右表的多条记录可以对应左表的一条记录,则证明右表中有一个外键对应左表的一个		字段
      #关系总结:
      	1:如果上面的1条件成立.就是左表多对一右表
      	2;如果上面的2条件成立,就是右表多对一左表
      	3:如果两个条件都成立,就是多对多,需要定义一个三方表,来存放两张表的关系
      	4:如果两个条件都不成立,而是左表的一条数据对应右表的一条数据,就是一对一,那么确	 定主从关系,从级表中就回有一个外键指向主表,这个外键要用unique 设置唯一,
      
posted @ 2019-10-03 23:40  luckinlee  阅读(522)  评论(0编辑  收藏  举报