数据库约束

1. 什么是数据库约束

数据库约束是指对数据库表中的数据所施加的规则或条件,⽤于确保数据的准确性和可靠性。这 些约束可以是基于数据类型、值范围、唯⼀性、⾮空等规则,以确保数据的正确性和相容性

2. 约束类型

NOTNULL      ⾮空约束 指定⾮空约束的列不能存储NULL值

DEFALUT默认约束       当没有给列赋值时使⽤的默认值

UNIQUE唯⼀约束       指定唯⼀约束的列每⾏数据必须有唯⼀的值

PRIMARYKEY主键约束     NOTNULL和UNIQUE的结合,可以指定⼀个列或多个列,有助于防⽌数据 重复和提⾼数据的查询性能

FOREIGNKEY外键约束         外键约束是⼀种关系约束,⽤于定义两个表之间的关联关系,可以确保数据 的完整性和⼀致性

CHECK约束       ⽤于限制列或数据在数据库表中的值,确保数据的准确性和可靠性

3. NOTNULL⾮空约束

⽐如创建⼀个学⽣表,学⽣名为NULL时,这条记录是不完整的  此时需要约束学⽣名的列不能为NULL

create table student (
 id bigint,
 name varchar(20) NOT NULL
 );

 4. DEFALUT默认值约束

DEFAULT 约束⽤于向列中插⼊默认值,如果没有为列设置值,那么会将默认值设置到该列

重构学⽣表,新增年龄列  插⼊⼀条记录,没有设置默认约束时,不指定年龄的值时列为NULL 为年龄的列加⼊默认约束

create table student (
 id bigint,
 name varchar(20) not null,
 age int DEFAULT 18
 );

5. UNIQUE唯⼀约束 

指 定了唯⼀约束的列,该列的值在所有记录中不能重复,⽐如⼀个⼈的⾝份证号,学⽣的学号等。

重构学⽣表,新增学号列   不设置唯⼀约束时,学号可以重复    为学号列设置唯⼀约束

drop table student;
 create table student (
 id bigint,
 name varchar(20) not null,
 age int DEFAULT 18,
 sno varchar(10) UNIQUE   # 唯⼀约束
); 

 6. PRIMARYKEY主键约束

主键约束唯⼀标识数据库表中的每条记录。 主键必须包含唯⼀的值,且不能包含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)

7. FOREIGNKEY外键约束 

外键⽤于定义主表和从表之间的关系 外键约束主定义在从表的列上,主表关联的列必须是主键或唯⼀约束 当定义外键后,要求从表中的外键列数据必须在主表的主键或唯⼀列存在或为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. CHECK约束

可以应⽤于⼀个或多个列,⽤于限制列中可接受的数据值,从⽽确保数据的完整性和准确性。 在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 = '⼥')
);

你可能感兴趣的:(数据库)