数据库约束是指对数据库表中的数据所施加的规则或条件,⽤于确保数据的准确性和可靠性。这 些约束可以是基于数据类型、值范围、唯⼀性、⾮空等规则,以确保数据的正确性和相容性
NOTNULL ⾮空约束 指定⾮空约束的列不能存储NULL值
DEFALUT默认约束 当没有给列赋值时使⽤的默认值
UNIQUE唯⼀约束 指定唯⼀约束的列每⾏数据必须有唯⼀的值
PRIMARYKEY主键约束 NOTNULL和UNIQUE的结合,可以指定⼀个列或多个列,有助于防⽌数据 重复和提⾼数据的查询性能
FOREIGNKEY外键约束 外键约束是⼀种关系约束,⽤于定义两个表之间的关联关系,可以确保数据 的完整性和⼀致性
CHECK约束 ⽤于限制列或数据在数据库表中的值,确保数据的准确性和可靠性
⽐如创建⼀个学⽣表,学⽣名为NULL时,这条记录是不完整的 此时需要约束学⽣名的列不能为NULL
create table student (
id bigint,
name varchar(20) NOT NULL
);
DEFAULT 约束⽤于向列中插⼊默认值,如果没有为列设置值,那么会将默认值设置到该列
重构学⽣表,新增年龄列 插⼊⼀条记录,没有设置默认约束时,不指定年龄的值时列为NULL 为年龄的列加⼊默认约束
create table student (
id bigint,
name varchar(20) not null,
age int DEFAULT 18
);
指 定了唯⼀约束的列,该列的值在所有记录中不能重复,⽐如⼀个⼈的⾝份证号,学⽣的学号等。
重构学⽣表,新增学号列 不设置唯⼀约束时,学号可以重复 为学号列设置唯⼀约束
drop table student;
create table student (
id bigint,
name varchar(20) not null,
age int DEFAULT 18,
sno varchar(10) UNIQUE # 唯⼀约束
);
主键约束唯⼀标识数据库表中的每条记录。 主键必须包含唯⼀的值,且不能包含NULL值。 每个表只能有⼀个主键,可以由单个列或多个列组成。通常为每张表都指定⼀个主键,主键列建议使⽤BIGINT类型
重构学⽣表,为ID列添加⾮空和唯⼀约束 通常把主键列设置为⾃动增⻓,让数据库维护主键值
create table student (
id bigint
PRIMARYKEY auto_increment, # 设置⾃增主键
name varchar(20) not null,
age int DEFAULT 18,
sno varchar(10) UNIQUE
);
主键或唯⼀键冲突时的更新操作,插⼊否则更新
INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...
# 插⼊ID为100,学号为100100的学⽣记录时,报主键冲突
insert into student(id, name, sno) values (100, '赵六', '100100');
替换,如果存在冲突则替换,不存在冲突则插⼊
# 语法
REPLACE [INTO] table_name
[(column [, column] ...)]
VALUES
(value_list) [, (value_list)] ...
value_list: value, [, value] ...
表中不能有多个主键
# 重构学⽣表
create table student (
id bigint PRIMARY KEY auto_increment, # 定义主键
name varchar(20) PRIMARY KEY
);
# 定义主键
ERROR 1068 (42000): Multiple primary key defined # 报错
复合主键:由多个列共同组成的主键,主键是否冲突以多个列的组成进⾏判定
# 重构学⽣表
create table student (
id bigint,
name varchar(20),
PRIMARY KEY (id, name) # 指定复合主键
);
# 插⼊数据
insert into student(id, name) values (1, '张三');
Query OK, 1 row affected (0.01 sec)
# 重复插⼊主键冲突,此时主键值由id和name两个列共同决定
insert into student(id, name) values (1, '张三');
ERROR 1062 (23000): Duplicate entry '1-张三' for key 'student.PRIMARY'
# 修改id值插⼊成功
insert into student(id, name) values (1, '张三');
ERROR 1062 (23000): Duplicate entry '1张三' for key 'student.PRIMARY'
# 修改id值插⼊成功
insert into student(id, name) values (2, '张三');
Query OK, 1 row affected (0.00 sec)
外键⽤于定义主表和从表之间的关系 外键约束主定义在从表的列上,主表关联的列必须是主键或唯⼀约束 当定义外键后,要求从表中的外键列数据必须在主表的主键或唯⼀列存在或为null。
重构学⽣表(从表),加⼊外键约束
# 语法 reforeignkey (id) referencesclass(id)
create table student(
id bigint PRIMARY KEY auto_increment,
name varchar(20) not null,
age int DEFAULT 18,
class_id bigint,
foreign key (class_id) references class(id) # 创建外键约束
);
可以应⽤于⼀个或多个列,⽤于限制列中可接受的数据值,从⽽确保数据的完整性和准确性。 在8.0.16开始全⾯⽀持CHECK约束,之前的版本会忽略CHECK的定义
重构学⽣表,有以下要求,年龄不能⼩于16岁,性别只能是男或⼥
# 加⼊CHECK约束
create table student(
id bigint PRIMARY KEY auto_increment, # 设置⾃增主键
name varchar(20) not null,
age int DEFAULT 18,
gender char(1),
check (age >= 16),
check (gender = '男' or gender = '⼥')
);