约束

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(外键)

你可能感兴趣的:(约束)