MySQL——约束(constraint)详细解释

时间:2022-04-11 01:25:38

  • 约束是什么用来干嘛?
    约束实际上就是表中数据的限制条件
    作用:表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效
    比如一些字段的唯一性,将一些字段约束成外键

  • 约束种类:
    非空约束(not null)
    唯一性约束(unique)
    主键约束(primary key) PK
    外键约束(foreign key) FK
    检查约束(目前MySQL不支持、Oracle支持)
  • A、非空约束
    用not null约束的字段不能为null值,必须给定具体的数据
    创建表,给字段添加非空约束(创建用户表,用户名不能为空)

    create table blog (
    id int(12) not null;
    )
    insert插入数据时如果插入id为null直接报错

    B、唯一性约束
    unique约束的字段,具有唯一性,不可重复,但可以为null
    创建表,保证邮箱地址唯一(列级约束)
    create table blog (
    id int(12) not null UNIQUE;
    )
    表级约束
    create table blog (
    id int(12) not null;
    UNIQUE(id);
    )
    如果插入相同 id 会报错
    使用表级约束,给多个字段联合约束
    联合约束,表示两个或以上的字段同时与另一条记录相等,则报错
    create table blog (
    id int(12) not null;
    name varchar(20) not null;
    unique(id,name);
    )
    如果与联合字段都相同,则报错
    表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)
    create table blog (
    id int(12) not null;
    name varchar(20) not null;
    CONSTRAINT t_id_name unique(id,name);
    )
    constraint是约束关键字,t_user_email_unique自己取的名字

    C、主键约束(primary key)PK
    表设计时一定要有主键
    主键约束
    主键字段
    主键值
    表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值
    主键约束与“not null unique”区别:给某个字段添加主键约束之后,该字段不能重复也不能为空,效果和”not null unique”约束相同,但是本质不同。
    主键约束除了可以做到”not null unique”之外,还会默认添加”索引——index”
    一张表应该有主键字段,如果没有,表示该表无效
    主键值:是当前行数据的唯一标识、是当前行数据的身份
    即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是两行不同的记录
    按主键约束的字段数量分类:无论是单一主键还是复合主键,一张表主键约束只能有一个(约束只能有一个,但可以作用到好几个字段)
    单一主键:给一个字段添加主键约束
    复合主键:给多个字段联合添加一个主键约束(只能用表级定义)
    1)单一主键(列级定义)
    mysql> create table t_user(
    -> id int(10) primary key,
    -> name varchar(30)
    -> );
    Query OK, 0 rows affected (0.07 sec)
    2)单一主键(表级定义)
    mysql> create table t_user(
    -> id int(10),
    -> name varchar(30) not null,
    -> constraint t_user_id_pk primary key(id)
    -> );
    Query OK, 0 rows affected (0.01 sec)
    3)复合主键(表级定义)
    mysql> create table t_user(
    -> id int(10),
    -> name varchar(30) not null,
    -> email varchar(128) unique,
    -> primary key(id,name)
    -> );
    Query OK, 0 rows affected (0.05 sec)

    在MySQL数据库提供了一个自增的数字,专门用来自动生成主键值,主键值不用用户维护,自动生成,自增数从1开始,以1递增(auto_increment)
    mysql> create table t_user(
    -> id int(10) primary key auto_increment,
    -> name varchar(30) not null
    -> );
    Query OK, 0 rows affected (0.03 sec)
    插入两行记录,id主键值会自动增加
    mysql> insert into t_user(name) values(‘jay‘);
    Query OK, 1 row affected (0.04 sec)

    mysql> insert into t_user(name) values(‘man‘);
    Query OK, 1 row affected (0.00 sec)

    mysql> select * from t_user;
    ---- ------
    | id | name |
    ---- ------
    | 1 | jay |
    | 2 | man |
    ---- ------
    2 rows in set (0.00 sec)

    D、外键约束(foreign key)FK
    只能是表级定义
    foreign key(classno) references t_class(cno)
    外键约束主要用来维护两个表之间数据的一致性
    外键约束
    外键字段
    外键值

    外键约束、外键字段、外键值之间的关系:某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值

    按外键约束的字段数量分类:a、单一外键:给一个字段添加外键约束
    b、复合外键:给多个字段联合添加一个外键约束

    一张表可以有多个外键字段(与主键不同)

    栗子:存储学生班级 信k 息
    mysql> drop table if exists t_student;
    mysql> drop table if exists t_class;

    mysql> create table t_class(
    -> cno int(10) primary key,
    -> cname varchar(128) not null unique
    -> );

    mysql> create table t_student(
    -> sno int(10) primary key auto_increment,
    -> sname varchar(30) not null,
    -> classno int(3),
    -> foreign key(classno) references t_class(cno)
    -> );

    mysql> insert into t_class(cno,cname) values(100,‘aaaaaaxxxxxx‘);
    mysql> insert into t_class(cno,cname) values(200,‘oooooopppppp‘);
    mysql> insert into t_student(sname,classno) values(‘jack‘,100);
    mysql> insert into t_student(sname,classno) values(‘lucy‘,100);
    mysql> insert into t_student(sname,classno) values(‘king‘,200);
    班级表t_class:
    mysql> select from t_class;
    ----- --------------
    | cno | cname |
    ----- --------------
    | 100 | aaaaaaxxxxxx |
    | 200 | oooooopppppp |
    ----- --------------
    学生表t_student:
    mysql> select
    from t_student;
    ----- ------- ---------
    | sno | sname | classno |
    ----- ------- ---------
    | 1 | jack | 100 |
    | 2 | lucy | 100 |
    | 3 | king | 200 |
    ----- ------- ---------
    上表中找出每个学生的班级名称:
    mysql> select s.,c. from t_student s join t_class c on s.classno=c.cno;
    ----- ------- --------- ----- --------------
    | sno | sname | classno | cno | cname |
    ----- ------- --------- ----- --------------
    | 1 | jack | 100 | 100 | aaaaaaxxxxxx |
    | 2 | lucy | 100 | 100 | aaaaaaxxxxxx |
    | 3 | king | 200 | 200 | oooooopppppp |
    ----- ------- --------- ----- --------------
    这就是数据实体的一对多关系模型:在多的那一方加外键来约束