MySQL六大约束

286 阅读7分钟

在 MySQL 中,约束是指对表中数据的一种约束,能够帮助数据库管理员更好地管理数据库,并且能够确保数据库中数据的正确性和有效性。

主键约束(PRIMARY KEY)

主键约束是使用最频繁的约束。在设计数据表时,一般情况下,都会要求表中设置一个主键。
主键是表的一个特殊字段,该字段能唯一标识该表中的每条信息。
例如,学生信息表中的学号是唯一的。

使用主键应注意以下几点:
  • 每个表只能定义一个主键。
  • 主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据。这是唯一性原则。
  • 一个字段名只能在联合主键字段表中出现一次。
  • 联合主键不能包含不必要的多余字段。当把联合主键的某一字段删除后,如果剩下的字段构成的主键仍然满足唯一性原则,那么这个联合主键是不正确的。这是最小化原则。
创建主键约束方式
1. 通过创建表的时候创建
    CREATE table 表名 ( 
        id int PRIMARY key 
    );
2. 通过语法去创建
    alter table 表名 modify 列名 数据类型 primary key;

创建主键约束限制:

  • 主键约束相当于唯一性约束+ 非空约束,主键约束不允许重复,也不允许出现空值。
  • 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别创建。
主键自增(auto_increment)

当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值。每增加一条记录,主键会自动以相同的步长进行增长。

使用限定:

  • 一个表中只能有一个字段使用 AUTO_INCREMENT 约束,且该字段必须有唯一索引。
  • AUTO_INCREMENT 约束的字段必须具备非空属性。
  • AUTO_INCREMENT 约束的字段只能是整数类型
  • AUTO_INCREMENT 约束字段的最大值受该字段的数据类型约束,如果达到上限,AUTO_INCREMENT 就会失效。
    create table 表名(
        id int primary key auto_increment,
        name char(4) not null;
    );

使用主键自增字段,insert插入数据时就不需要给主键赋值。
也可以指定自增字段初始值
如果第一条记录设置了该字段的初始值,那么新增加的记录就从这个初始值开始自增。例如,如果表中插入的第一条记录的 id 值设置为 5,那么再插入记录时,id 值就会从 5 开始往上增加。

    create table 表名(
        id int primary key auto_increment,
        name char(4) not null;
    )auto_increment=5;

注:如果表中 id 逐渐已经有“1”这条记录,继续插入主键为“1”这条记录时,会报 Duplicate key error (唯一键冲突)。在这之后,再插入新的数据时,自增 id 就是 3,这样就出现了自增字段值不连续的情况。
MARK:
如果我们在创建表的时候没有设置一个主键约束怎么办?

  • 如果没有定义主键,系统会自动使用第一非空的唯一索引(NOT NULL and UNIQUE INDEX)作为聚簇索引。
  • 如果既没有主键也找不到合适的非空索引,那么InnoDB会自动生成一个不可见的名为row_id的列名为GEN_CLUST_INDEX的聚簇索引,该列是一个6字节的自增数值,随着插入而自增--补充:该全局row_id在代码实现上使用的是bigint unsigned类型,但实际上只给row_id留了6字节,这种设计就会存在一个问题:如果全局row_id一直涨,一直涨,直到2的48幂次-1时,这个时候再+1,row_id的低48位都为0,结果在插入新一行数据时,拿到的row_id就为0,存在主键冲突的可能性。

引用
作者:进阶的派大星
链接:juejin.cn/post/715882…

外键约束(FOREIGE KEY)

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。例如:一个学生表,里面有id,姓名,年龄,班级,班主任字段,班级和班主任这两个字段就可以建立外键约束与老师表和班级表建立联系。
好处:首先是方便查询,当你需要去查看这个学生的班主任的信息时,只需要获取学生的班主任字段的值去老师表中查询就行;其次是保证数据的一致性和完整性,当一个老师辞职或其他缘故无法正常带学生后一个只对老师进行删除/修改就可以对学生表也进行操作。
创建外键约束限制

  • 主表必须已经存在于数据库中。
  • 必须为主表定义主键。
  • 主键不能包含空值,但允许在外键中出现空值。
  • 外键中列的数目必须和主表的主键中列的数目相同。
  • 外键中列的数据类型必须和主表主键中对应列的数据类型相同。
添加外键约束
在创建表时添加外键约束
CONSTRAINT FOREIGN KEY (外键字段) REFERENCES 主表名 (主键列)
eg:
    create table 主表名(
        id int primary key,
        name varchar(22) not null,
        age int not null,
        class int not null,
        classname varchar(22)
    );
    create table 从表名(
        tid int primary key,
        tname varchar(22),
        constraint foreign key (tname) references 主表名 (classname) #添加外键约束
    );
在修改表时添加外键约束
ALTER TABLE 数据表名 ADD CONSTRAINT 外键名 
FOREIGN KEY(列名) REFERENCES 主表名 (列名);
删除外键约束
    ALTER TABLE 表名 DROP FOREIGN KEY 外键约束名;
eg:
    alter table 从表名 drop foreign key tname;

唯一约束(UNIQUE)

唯一约束是指所有记录中字段的值不能重复出现。
例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况。如果其中一条记录的 id 值为‘1’,那么该表中就不能出现另一条记录的 id 值也为‘1’。

MARK

  • 表可包含多个唯一约束,但每个表只允许一个主键。 
  • 唯一约束列可包含 NULL 值,唯一约束列可修改或更新。
  • 唯一约束列的值可重复使用。
  • 唯一约束不能用来定义外键。
添加唯一约束
在创建表时添加唯一约束
字段名 数据类型 UNIQUE
eg:
    create table student(
        id int primary key,
        name varchar(22) not null,
        age int(4) unique
    );
在修改表时添加唯一约束
ALTER TABLE 数据表名 ADD CONSTRAINT 唯一约束名 UNIQUE(列名);
删除唯一约束
ALTER TABLE 表名 DROP INDEX 唯一约束名;
eg:
    alter table student drop index 18;

检查约束(CHECK)

用来检查数据表中,字段值是否有效,减少无效数据的输入。

添加检查约束
在创建表时设置检查约束
CHECK(检查约束)
eg:
    create table 表名(
        id int primary key,
        name varchar(22) not null,
        salary float,
        check(salary > 0 and salary < 1000)
    );
在修改表时添加检查约束
alter tble 表名 constraint 检查约束名 check (检查约束条件)
删除检查约束
alter table 数据表名 DROP CONSTRAINT 检查约束名;
eg:
    alter table student drop constraint salary;

非空约束(NOT NULL)

非空约束指字段的值不能为空。对于使用了非空约束的字段,如果用户在添加数据时没有指定值,数据库系统就会报错。

添加非空约束
在创建表时设置非空约束
字段名 数据类型 NOT NULL;
eg:
    create table student(
        id int primary key,
        name varchar(22) not null
    );
在修改表时添加非空约束
ALTER TABLE 数据表名 modify 字段名 数据类型 NOT NULL;
eg:
    alter table student modify name varchar(22) not null;
删除非空约束
alter table 表名 modify 字段名 数据类型 NULL

默认值约束(DEFAULT)

默认值约束用来指定某列的默认值。在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。

添加默认值约束
在创建表时设置默认值约束
字段名 数据类型 DEFAULT 默认值;
eg:
    create table student(
        id int primary key,
        name varchar(22) not null,
        class varchar(22) default '一班'
    );
在修改表时添加默认值约束
alter table 数据表名 modify 字段名 数据类型 default 默认值;
eg:
    alter table student modify class varchar(22) default '一班'
删除默认值约束
alter table 数据名称 modify 字段名 数据类型 not null; 

查看表中的约束

show create table 数据表名;