约束

作者: knot98 | 来源:发表于2018-09-13 17:25 被阅读0次

    1. 什么是约束

    除了数据类型以外额外添加的约束
    

    2. 为什么要使用约束

    为了保证数据的合法性(mysql规则),完整性
    

    3. 分类

    not null

    非空约束  数据不能为空
    

    default

    默认值约束
    

    unique

    唯一约束  该字段不能重复
        unique 其实是一种索引
            索引是一种数据结构  用于提高查询效率
        可以为空
        一张表中可以有多个唯一约束
        单列唯一约束:
            mysql> create table t12(`id card` char(18) unique);
            mysql> desc t12;
            +---------+----------+------+-----+---------+-------+
            | Field   | Type     | Null | Key | Default | Extra |
            +---------+----------+------+-----+---------+-------+
            | id card | char(18) | YES  | UNI | NULL    |       |
            +---------+----------+------+-----+---------+-------+
            1 row in set (0.02 sec)
        多列唯一约束:
            mysql> create table t13(`id card` char(18),`phone number` char(11),unique(`id card`,`phone number`));
            mysql> desc t13;
            +--------------+----------+------+-----+---------+-------+
            | Field        | Type     | Null | Key | Default | Extra |
            +--------------+----------+------+-----+---------+-------+
            | id card      | char(18) | YES  | MUL | NULL    |       |
            | phone number | char(11) | YES  |     | NULL    |       |
            +--------------+----------+------+-----+---------+-------+
            2 rows in set (0.01 sec)
    

    primary key

    主键约束:用于唯一标识表中一条数据(非空且唯一)
            也就是说从约束的角度去看 主键约束 和 非空加唯一约束  没有区别
            那它们之间的区别是什么?
                唯一约束:是一种索引,必然存在于硬盘的某个文件中(物理存在)
                primary key :是一种逻辑意义上的数据(实际上不存在,抽象概念)
                换句话说主键就是由唯一约束与非空约束组成的约束
    
        语法:
            mysql> create table t14(
            `student id` int primary key,
            name char(10)
            );
            mysql> desc t14;
            +------------+----------+------+-----+---------+-------+
            | Field      | Type     | Null | Key | Default | Extra |
            +------------+----------+------+-----+---------+-------+
            | student id | int(11)  | NO   | PRI | NULL    |       |
            | name       | char(10) | YES  |     | NULL    |       |
            +------------+----------+------+-----+---------+-------+
            2 rows in set (0.02 sec)
    
        有无主键的区别?
            1. 无法区分两个相同的数据,比如班级中有两个人名字相同
            2. 有主键则以为着有索引,效率更高
            3. 可以建立关联关系
        多列联合主键:
            mysql> create table t15(
            `id card` char(18),
            `phone number` char(11),
            primary key(`id card`,`phone number`)
            );
            mysql> desc t15;
            +--------------+----------+------+-----+---------+-------+
            | Field        | Type     | Null | Key | Default | Extra |
            +--------------+----------+------+-----+---------+-------+
            | id card      | char(18) | NO   | PRI |         |       |
            | phone number | char(11) | NO   | PRI |         |       |
            +--------------+----------+------+-----+---------+-------+
            2 rows in set (0.02 sec)
        要不要主键??
            必须的,每个表都应该有主键,哪怕不用唯一标识,也应该考虑提升效率
            一般主键的字段都叫 id ,数据类型都用 int 类型
        同一表中设置多个主键没有任何意义
        小练习:
            创建一个员工表 里面存储 员工编号 姓名 年龄 性别;
             mysql> create table emp(
            id int primary key,
            name char(10) not null,
            age int not null,
            sex char(6) default 'male'
            );
            mysql> desc emp;
            +-------+----------+------+-----+---------+-------+
            | Field | Type     | Null | Key | Default | Extra |
            +-------+----------+------+-----+---------+-------+
            | id    | int(11)  | NO   | PRI | NULL    |       |
            | name  | char(10) | NO   |     | NULL    |       |
            | age   | int(11)  | NO   |     | NULL    |       |
            | sex   | char(6)  | YES  |     | male    |       |
            +-------+----------+------+-----+---------+-------+
            4 rows in set (0.02 sec)
    
            mysql> insert into emp(id,name,age) values
            (1,'杨总',60),
            (2,'egon',59),
            (3,'虎老师',58);
             # 问题? 你很可能忘记上一次的id到多少了,导致你要先查看一下
             # 麻烦,并且影响效率,所以有了auto_increment
            mysql> select * from emp;
            +----+-----------+-----+------+
            | id | name      | age | sex  |
            +----+-----------+-----+------+
            |  1 | 杨总      |  60 | male |
            |  2 | egon      |  59 | male |
            |  3 | 虎老师    |  58 | male |
            +----+-----------+-----+------+
            3 rows in set (0.00 sec)
    

    auto_increment

      自动增长
        作用: 通常搭配主键字段使用,可以自动为你的数据分配主键
        如何分配:
            添加一条数据 主键(id)就自动加1,计数从1开始
        语法:
            mysql> create table t16(
            id int primary key auto_increment,
            name char(10)
            );
    
            mysql> desc t16;
            +-------+----------+------+-----+---------+----------------+
            | Field | Type     | Null | Key | Default | Extra          |
            +-------+----------+------+-----+---------+----------------+
            | id    | int(11)  | NO   | PRI | NULL    | auto_increment |
            | name  | char(10) | YES  |     | NULL    |                |
            +-------+----------+------+-----+---------+----------------+
            2 rows in set (0.02 sec)
    
            mysql> insert into t16(name) values
            ('yyh'),
            ('egon'),
            ('lxx');
            mysql> select * from t16;
            +----+------+
            | id | name |
            +----+------+
            |  1 | yyh  |
            |  2 | egon |
            |  3 | lxx  |
            +----+------+
            3 rows in set (0.00 sec)
    
        如果主键是自动增长 , 你可以跳过此字段,也可以插入null,都会自动增长
        修改自动增长的起始位置:
            alter table 表名 auto_increment = 值
        注意:自动增长,只能用于整型,不能用于字符型
    

    foreign(外键)

    相关文章

      网友评论

          本文标题:约束

          本文链接:https://www.haomeiwen.com/subject/ofcggftx.html