一、什么约束?常见的约束

保证表中数据的完整性,合法性,有效性

  • 非空 not null 不能为null
  • 唯一 unique 不能重复
  • 主键 primary key 不能为null,也不能重复(简称 PK)
  • 外键 foreign key (简称FK)
  • 默认 default
  • 检查 check :orcale数据库有,mysql不支持

    1、非空约束 not null

  • 被修饰的字段不能为null

  • 只能列级约束,之能加在字段后面 ```sql Drop table if exists t_user 如果表存在把表删掉 Create table t_user (
    1. Id int primary key, #id为主键不能为空,不能重复,必须是int
    2. username varchar(255) unique, #username 为唯一,不能重复
    3. Password varchar(255) not null #passwrod非空,不能为null
    ); Insert into t_user(id,username) values(1,’zhangsan’); 报ERROR 1364 (HY000): Field ‘passwrod’ doesn’t have a default value 代号1364异常表示 该字段不能插入null。
  1. <a name="BzySS"></a>
  2. ## 2、唯一约束 unique
  3. <a name="dUR3y"></a>
  4. ##### 被修饰的字段不能重复,可以为null(多个null)
  5. ```sql
  6. Create table t_user (
  7. Id int primary key, #id为主键不能为空,不能重复,必须是int
  8. username varchar(255) unique, #username 为唯一,不能重复
  9. Password varchar(255) not null #passwrod非空,不能为null
  10. );
  11. 插入username重复数据:
  12. insert into t_user values(2,'zhangsan','v');
  13. 报错:ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'username'

1) 表级约束

给两个列或者多个列添加unique

  1. Create table t_user(
  2. Id int primary key,
  3. Username varchar(255),
  4. Usercode varchar(255),
  5. Unique(username,usercode) #表示username和usercode联合起来唯一
  6. )
  7. 上面这种方式,也就是说只有插入的数据 username usercode 都相同时才会报错

2) 列级约束

  1. Create table t_user(
  2. Id int primary key,
  3. Username varchar(255) Unique,
  4. Usercode varchar(255) Unique
  5. )
  6. 上面这种表示,分开唯一,并不是联合

3、主键约束

  1. Create table t_user(
  2. Id int primary key, #列级约束
  3. Username varchar(255)
  4. );

:::info 被主键约束的字段不能为null也不能重复
一张表的主键约束只能有一个 :::

主键的作用

这行记录的唯一标识
分类
根据主键字段的字段数量来划分

  • 单一主键(常用)
  • 复合主键

根据主键的性质来划分

  • 自然主键:主键值最好就是一个和系统业务没有任何关系的自然数
  • 业务主键:主键值和系统的业务挂钩,例如拿着银行卡的卡号做主键【不建议使用】

    1) 使用表级约束定义主键

    1. Drop table if exists t_user;
    2. Create table t_user(
    3. Id int,
    4. Username varchar(255),
    5. Password varchar(255)
    6. Primary key(id)
    7. );

    2) 自增长列 auto_increment

    1. Drop table if exists t_user ;
    2. Create table t_user(
    3. Id int primary key auto_increment, #自增长列
    4. Username varchar(255)
    5. );

    4、外键约束foreign key

    关于外键约束的相关术语
    外键字段:foreign key
    外键约束:被修饰的字段
    外键值:字段里面的值
    作用:

  • 如果一张表【student】引用了【class】的外键约束,那么student为子表,class为父表(父子关系)

  • t_student表中的classno字段引用t_class表中的cno字段,此时t_student叫做子表,t_class为父表

    注意:
  • 外键可以为null

  • 主表的关联列必须是一个key(主键/唯一)
  • 被外键约束的字段,不能随便写,要写写的是另一个表中有的数据


  • 在删表的时候,先删除子表,在删除父表。
  • 在创建表的时候,先创建父表,在创建子表。
  • 添加数据的时候,先添加父表,在添加子表。
  • 删除数据的时候,先删除子表,在删除父表。


  1. Drop table if exists t_student; #先删子 再删父
  2. Drop table if exists t_class;
  3. ----------------------------------------------------------
  4. Create table t_class( #先创建父 在创建子
  5. Cno int primary key,
  6. Cname varchar(255)
  7. );
  8. ----------------------------------------------------------
  9. Create table t_student(
  10. Sno int primary key,
  11. Sname varchar(255),
  12. Classno int,
  13. Foreign key (Classno) references t_class(Cno)
  14. #外键约束,标识本表中的classno引用t_class表中的cno
  15. );
  16. ----------------------------------------------------------
  17. 插入数据先插入父,再插入子
  18. Insert into t_class values(101,'dingzhouyizhong')
  19. Insert into t_student values(1,'zhangsan','101')