• 数据库的约束


    • 约束的介绍和作用

      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 设置唯一,
        
  • 相关阅读:
    Chrome 使用 Evernote 插件
    【MySQL】ON DUPLICATE KEY UPDATE
    【MySQL】Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) and ...
    libevent API
    LLServer--》对LevelDB的应用
    Linux信号signal处理机制
    守护进程
    使用 libevent 和 libev 提高网络应用性能(IBM)
    Libev和LibEvent
    利用TokyoTyrant构建兼容Memcached协议、支持故障转移、高并发的分布式Key-value持久存储系统(转)
  • 原文地址:https://www.cnblogs.com/luckinlee/p/11621148.html
Copyright © 2020-2023  润新知