MySQL,作为一款广泛使用的关系型数据库管理系统,提供了多种约束机制来保障数据的一致性和可靠性
这些约束不仅能够有效防止无效或错误的数据进入数据库,还能提高数据的整体质量
本文将深入探讨MySQL数据库中的约束类型,帮助读者更好地理解和应用这些约束
一、MySQL约束的基本概念 数据库约束是关系型数据库的一个重要功能,用于确保数据的完整性、一致性和准确性
约束通过对表数据附加条件限制,实现保障数据完整性的目标
在MySQL中,约束可以在创建表时通过CREATE TABLE语句定义,也可以在表创建之后通过ALTER TABLE语句添加或修改
根据约束的作用范围,MySQL中的约束可以分为列级约束和表级约束
列级约束只能作用在一个列上,紧跟在列的定义后面;而表级约束则可以作用在多个列上,不与列一起定义,而是单独列出
二、MySQL的主要约束类型 1.非空约束(NOT NULL) 非空约束规定表中的某一列不允许插入NULL值
NULL在数据库中代表没有值,如果给设置了非空约束的列插入NULL,数据库会拒绝该操作
非空约束只能出现在表对象的列上,只能对某个列单独限定非空,不能组合使用
- 添加非空约束:在建表时,可以通过在列定义后添加NOT NULL来指定该列为非空
例如,`CREATE TABLE students(id BIGINT NOT NULL, name VARCHAR(50) NOT NULL);`
在表创建后,也可以通过ALTER TABLE语句来添加非空约束,如`ALTER TABLE students MODIFY name VARCHAR(50) NOT NULL;`
- 删除非空约束:同样,可以通过ALTER TABLE语句来删除已存在的非空约束,如`ALTER TABLE students MODIFY name VARCHAR(50);`
2.默认约束(DEFAULT) 默认约束用于为表中的列指定默认值
当插入数据时,如果没有为设置了默认约束的列提供值,数据库将自动使用该默认值填充该列
- 添加默认约束:在建表时,可以通过在列定义后添加DEFAULT关键字和默认值来指定该列的默认值
例如,`CREATE TABLE students(id BIGINT, name VARCHAR(50) DEFAULT Unknown);`
在表创建后,也可以通过ALTER TABLE语句来添加或修改默认约束,如`ALTER TABLE students MODIFY name VARCHAR(50) DEFAULT Unknown Student;`
- 删除默认约束:可以通过ALTER TABLE语句来删除已存在的默认约束,如`ALTER TABLE students MODIFY name VARCHAR(50);`
3.唯一约束(UNIQUE) 唯一约束确保表中的某一列或某几列的组合在表中是唯一的,不允许出现重复的值
但需要注意的是,唯一约束允许存在多个NULL值,因为NULL在数据库中代表没有值,不视为重复
- 添加唯一约束:在建表时,可以通过在列定义后添加UNIQUE关键字来指定该列为唯一约束列
例如,`CREATE TABLE students(id BIGINT UNIQUE, name VARCHAR(50));`
此外,还可以通过在表级约束中定义唯一约束,如`CREATE TABLE students(id BIGINT, name VARCHAR(50), CONSTRAINT unique_name UNIQUE(name));`
在表创建后,也可以通过ALTER TABLE语句来添加唯一约束,如`ALTER TABLE students ADD UNIQUE(name);`
- 删除唯一约束:可以通过ALTER TABLE语句来删除已存在的唯一约束,如`ALTER TABLE students DROP INDEX unique_name;`(注意,这里的unique_name是唯一约束的名称,如果是通过列级约束定义的唯一约束,则名称可能由数据库自动生成)
4.主键约束(PRIMARY KEY) 主键约束是一种特殊的唯一约束,它不仅要求列中的值唯一,还要求列中的值不能为NULL
主键约束通常用于标识表中的每一行记录,是表与表之间建立关联的关键
- 添加主键约束:在建表时,可以通过在列定义后添加PRIMARY KEY关键字来指定该列为主键
例如,`CREATE TABLE students(id BIGINT PRIMARY KEY, name VARCHAR(50));`
此外,还可以通过在表级约束中定义主键约束,如`CREATE TABLE students(id BIGINT, name VARCHAR(50), CONSTRAINT pk_students PRIMARY KEY(id));`
在表创建后,也可以通过ALTER TABLE语句来添加主键约束,但需要注意的是,如果表中已经存在数据,且指定为主键的列中存在重复值或NULL值,则添加主键约束的操作会失败
- 删除主键约束:可以通过ALTER TABLE语句来删除已存在的主键约束,如`ALTER TABLE students DROP PRIMARY KEY;`
5.自增长约束(AUTO_INCREMENT) 自增长约束通常与主键约束一起使用,用于指定某一列的值为自动递增的整数
这样,在插入新记录时,数据库会自动为该列生成一个唯一的、递增的整数作为记录的唯一标识
- 添加自增长约束:在建表时,可以通过在列定义后添加AUTO_INCREMENT关键字来指定该列为自增长列
例如,`CREATE TABLE students(id BIGINT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));`
需要注意的是,自增长列必须是主键列,且数据类型通常为整数类型
在表创建后,不能通过ALTER TABLE语句直接添加自增长约束到已存在的列上;如果需要为已存在的表添加自增长约束,通常需要先删除主键约束(如果存在),然后重新创建主键约束并指定为自增长列
- 删除自增长约束:可以通过ALTER TABLE语句来删除已存在的自增长约束,但需要先删除主键约束(因为自增长约束通常是与主键约束一起使用的)
例如,可以先通过`ALTER TABLE students DROP PRIMARY KEY;`删除主键约束,然后通过修改列定义来删除自增长约束,如`ALTER TABLE students MODIFY id BIGINT;`
然而,这种方法会丢失该列上的主键约束和自增长约束;如果只需要删除自增长约束而保留主键约束,则需要先创建一个新的没有自增长约束的主键列,然后将数据复制到新列中,并删除旧列
6.外键约束(FOREIGN KEY) 外键约束用于在两个表之间建立关联关系,确保子表中的值在父表中存在
这样,可以维护表之间的参照完整性,防止出现孤立记录或不一致的数据
- 添加外键约束:在建表时,可以通过在表级约束中定义外键约束来指定两个表之间的关联关系
例如,`CREATE TABLE orders(order_id BIGINT PRIMARY KEY, student_id BIGINT, CONSTRAINT fk_student FOREIGN KEY(student_id) REFERENCES students(id));`
在表创建后,也可以通过ALTER TABLE语句来添加外键约束,如`ALTER TABLE orders ADD CONSTRAINT fk_student FOREIGN KEY(student_id) REFERENCES students(id);`
- 删除