MySQL -- 约束

1. 数据库约束

数据库约束时关系型数据库的一个重要功能,主要的作用是保证数据的有效性,也可以理解为数据的正确性(数据本身是否正确,关联关系是否正确) **人工检查数据的完整性工作量非常大,在数据库中定义一些约束,那么数据在写入数据库的时候,就会帮我们做一些校验.**并且约束一般是在指定列上创建的.

2. 约束类型

类型

说明

NOTNULL空约束 (常用

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

DEFALUT默认约束(常用

当没有给列赋值时使的默认值

UNIQUE唯约束(常用

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

PRIMARYKEY主键约束(常用

NOTNULL和UNIQUE的结合,可以指定个列或多个列,有助于防数据重复和提数据的查询性能

FOREIGNKEY外键约束(目前不用)

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

CHECK约束 (不用)

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

3. NOTNULL空约束

定义表时某列不允许为NULL时,可以为列添加空约束。

  • 如创建个学表,学名为NULL时,这条记录是不完整的


  • 此时需要约束学名的列不能为NULL


  • 由于name列有空约束,插NULL值时报错,但插入name的正确值就能通过
  • 查看表结构,NULL列为NO表值不允许为NULL,YES表值可以为NUL

4. DEFALUT默认值约束

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

  • 首先我们创建一个表,新增年龄列

示例:

  • 我们希望插入进来的数据,没有给定年龄时,会默认有年龄,那么我们重构学生表,为年龄加入默认约束在要加约束的列名后直接加default默认值即可

    create table family (

    id bigint,

    name varchar(20) NOT NULL,

    age int default 18

    );

  • 插条记录,不指定年龄的值时列使了默认值

  • 查看表结构,年龄列的默认值为18
  • 当我们插入年龄列为NULL时,是否默认值还是18?但当动明确指年龄列为NULL时列值为NULL,不会使用默认值

5. UNIQUE唯约束

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

  • 重构学生表,id列后增加唯一约束

    drop table if exists student;

    create table student2 (

    id bigint UNIQUE,

    name varchar(20) not null

    );

  • 我们发现不设置唯一约束时,id可以重复

  • 我们发现为id列添加唯一约束后,相同的则不能插入进去,唯一约束生效

  • 在id列添加 UNIQUE关键字,为 id 设置唯一约束; 查看表结构,Key列显UNI表唯约束

  • 但当插入NULL值时,依旧可以插入

6. PRIMARYKEY主键约束

主键约束唯标识数据库表中的每条记录。

主键必须包含唯的值,且不能包含NULL值。

每个表只能有个主键,可以由单个列或多个列组成。

通常为每张表都指定个主键,主键列建议使BIGINT类型

  • 重构学表,为ID列添加空和唯约束

    drop table student;

    create table student (

    id bigint not null unique,

    name varchar(20) not null,

    age int DEFAULT 18,

    sno varchar(10) UNIQUE

    );

  • 查看表结构,添加了空和唯约束之后Key列显PRI表主键

    从此处我们可以知道 PRIMARY KEY= NOT NULL + UNIQUE

  • 当Id列的值重复时会发主键冲突

  • 通常把主键列设置为动增(auto_increment),让数据库维护主键值 PRIMARY KEY auto_increment

  • 插数据时不设置主键列的值

上图中我们插错了一条数据,那我们的自增主键id会走到什么位置?2还是3 接着我们查看一下,此时发现id是从3开始的,这是为何?因为在数据库中插入数据正确或错误,自增主键都会向下走一步,不会回退,这样可以提高查询效率。

  • 查看表结构,Extra列显auto_increment表增

  • 主键值是自增的,那么是否可以不连续呢?此时我们插入主键值为100的数据,我们发现插入成功,所以主键值可以不连续。

  • 那么我们发现,插入100主键值之后,自增主键将从哪里自增呢??我们发现:下一次自增从主键的最大值开始

  • 主键或唯键冲突时的更新操作,插否则更新

1.插入

2.更新

可以使以上语法,如果插时有冲突则更新当前列的值, 两受影响,表删除了原来的记录,新写了条记录其update student set name ='钱六',number='100011' where id=100;等效

3.替换

如果表中没有冲突则直接插入新数据,和insert的功能是一样的。


  • 表中不能有多个主键

    drop table student;

    重构学?表

    create table student (

    id bigint PRIMARY KEY auto_increment, # 定义主键

    name varchar(20) PRIMARY KEY

    ); # 定义主键

    ERROR 1068 (42000): Multiple primary key defined # 报错

7. FOREIGNKEY外键约束

外键于定义主表和从表之间的关系

外键约束主定义在从表的列上,主表关联的列必须是主键或唯约束

当定义外键后,要求从表中的外键列数据必须在主表的主键或唯列存在或为null。

7.1 语法

复制代码
foreign key (id) references class(id)


  • 删除主表某条记录时,从表中不能有对该记录的引

  • 删除主表时要先删除从表

    删除主表时,应该先解除主外键关系或者删除从表

8. CHECK约束

可以应于个或多个列,于限制列中可接受的数据值,从确保数据的完整性和准确性。

在8.0.16开始全持CHECK约束,之前的版本会忽略CHECK的定义

但是注意,一般在应用程序级别校验

  • 重构学表,有以下要求,年龄不能于16岁,性别只能是男或

    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 = '?')

    );

  • c1的值不能为0,c2的值必须于0,c3的值不于c2

    create table t_check (

    c1 int check(c1 <> 0),

    c2 int check(c2 > 0),

    c3 int,

    check(c3 >= c2)

    );

相关推荐
0xDevNull4 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花4 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸4 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain4 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希5 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神5 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员5 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java5 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿5 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴5 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存