MySQL 8.0新特性 — 检查性约束的使用简介

 更新时间:2021年03月19日 10:49:08   作者:brightdeng@DBA  
这篇文章主要介绍了MySQL 8.0新特性 — 检查性约束的简单介绍,帮助大家更好的理解和学习使用MySQL数据库,感兴趣的朋友可以了解下

前言

在MySQL 8.0版本中,引入了一个非常有用的新特性 — 检查性约束,它可以提高对非法或不合理数据写入的控制能力;接下来我们就来详细了解一下。

检查性约束

创建、删除与查看

(1)可以在建表时,创建检查性约束

mysql> CREATE TABLE t1
 -> (
 -> CHECK (c1 <> c2),
 -> c1 INT CHECK (c1 > 10),
 -> c2 INT CONSTRAINT c2_positive CHECK (c2 > 0),
 -> c3 INT CHECK (c3 < 100),
 -> CONSTRAINT c1_nonzero CHECK (c1 <> 0),
 -> CHECK (c1 > c3)
 -> );
Query OK, 0 rows affected (0.03 sec)

(2)也可以通过下列语句,新增检查性约束

mysql> ALTER TABLE t1 ADD CONSTRAINT c3_nonzero CHECK ((c3<>0));
Query OK, 0 rows affected (0.16 sec)
Records: 0 Duplicates: 0 Warnings: 0

(3)可以通过下列语句,删除检查性约束

mysql> ALTER TABLE t1 DROP CONSTRAINT c3_nonzero;
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0

(4)可以通过查询表结构的方式,查看检查性约束

mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
 Table: t1
Create Table: CREATE TABLE `t1` (
 `c1` int DEFAULT NULL,
 `c2` int DEFAULT NULL,
 `c3` int DEFAULT NULL,
 CONSTRAINT `c1_nonzero` CHECK ((`c1` <> 0)),
 CONSTRAINT `c2_positive` CHECK ((`c2` > 0)),
 CONSTRAINT `t1_chk_1` CHECK ((`c1` <> `c2`)),
 CONSTRAINT `t1_chk_2` CHECK ((`c1` > 10)),
 CONSTRAINT `t1_chk_3` CHECK ((`c3` < 100)),
 CONSTRAINT `t1_chk_4` CHECK ((`c1` > `c3`))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

(5)也可以通过下面两个视图查看,其中table_constraints查询表存在哪些约束,check_constraints查询检查性约束的具体定义

mysql> SELECT * FROM information_schema.table_constraints WHERE table_name='t1';
+--------------------+-------------------+-----------------+--------------+------------+-----------------+----------+
| CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | TABLE_SCHEMA | TABLE_NAME | CONSTRAINT_TYPE | ENFORCED |
+--------------------+-------------------+-----------------+--------------+------------+-----------------+----------+
| def | test | c1_nonzero | test | t1 | CHECK | YES |
| def | test | c2_positive | test | t1 | CHECK | YES |
| def | test | t1_chk_1 | test | t1 | CHECK | YES |
| def | test | t1_chk_2 | test | t1 | CHECK | YES |
| def | test | t1_chk_3 | test | t1 | CHECK | YES |
| def | test | t1_chk_4 | test | t1 | CHECK | YES |
+--------------------+-------------------+-----------------+--------------+------------+-----------------+----------+
6 rows in set (0.00 sec)

mysql> SELECT * FROM information_schema.check_constraints WHERE constraint_name='c1_nonzero';
+--------------------+-------------------+-----------------+--------------+
| CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | CHECK_CLAUSE |
+--------------------+-------------------+-----------------+--------------+
| def | test | c1_nonzero | (`c1` <> 0) |
+--------------------+-------------------+-----------------+--------------+
1 row in set (0.00 sec)

(6)当插入不符合检查性约束的数据时,会直接报错

mysql> insert into t1 values(0,0,0);
ERROR 3819 (HY000): Check constraint 'c1_nonzero' is violated.

限制

(1)自增列和其他表的列,不支持检查性约束

(2)不确定的函数,如CONNECTION_ID(),CURRENT_USER(),NOW()等,不支持检查性约束

(3)用户自定义函数,不支持检查性约束

(4)存储过程,不支持检查性约束

(5)变量,不支持检查性约束

(6)子查询,不支持检查性约束

总结

检查性约束,还是一个非常不错的功能,可以实现丰富的数据校验场景,大家可以尝试一下。

以上就是MySQL 8.0新特性 — 检查性约束的简单介绍的详细内容,更多关于MySQL 8.0新特性 — 检查性约束的资料请关注脚本之家其它相关文章!

相关文章

  • 详解mysql索引总结----mysql索引类型以及创建

    详解mysql索引总结----mysql索引类型以及创建

    索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。这篇文章主要介绍了详解mysql索引总结----mysql索引类型以及创建,有兴趣的可以了解一下。
    2016-11-11
  • mysql 删除操作(delete+TRUNCATE)

    mysql 删除操作(delete+TRUNCATE)

    这篇文章主要介绍了mysql 删除操作,主要包括了delete与TRUNCATE的使用,需要的朋友可以参考下
    2014-11-11
  • MySQL的索引原理以及查询优化详解

    MySQL的索引原理以及查询优化详解

    这篇文章主要为大家介绍了MySQL的索引原理以及查询优化,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • mysql触发器之创建多个触发器操作实例分析

    mysql触发器之创建多个触发器操作实例分析

    这篇文章主要介绍了mysql触发器之创建多个触发器操作,结合实例形式分析了mysql创建及使用多个触发器的相关操作技巧,需要的朋友可以参考下
    2019-12-12
  • MySQL数据库如何给表设置约束详解

    MySQL数据库如何给表设置约束详解

    约束主要完成对数据的检验,保证数据库数据的完整性;如果有相互依赖数据,保证该数据不被删除,本篇文章教你如何给表设置约束
    2022-03-03
  • MySQL生成千万测试数据以及遇到的问题

    MySQL生成千万测试数据以及遇到的问题

    前两天发现同事要做一个对大表进行范围查询的功能,所以需要生成千万数据进行性能测试,下面这篇文章主要给大家介绍了关于MySQL生成千万测试数据以及遇到的问题的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • CentOS系统中安装MySQL和开启MySQL远程访问的方法

    CentOS系统中安装MySQL和开启MySQL远程访问的方法

    这篇文章主要介绍了CentOS系统中安装MySQL和开启MySQL远程访问的方法,包括MySQL的随机启动等操作的介绍,需要的朋友可以参考下
    2016-02-02
  • Linux 安装 MySQL 8.0 及 配置方法

    Linux 安装 MySQL 8.0 及 配置方法

    本文详细介绍了在Ubuntu操作系统上使用MySQL APT存储库安装和配置MySQL 8.0的步骤,本文通过图文示例相结合给大家讲解的非常详细,感兴趣的朋友一起看看吧
    2024-11-11
  • ERROR 1406 : Data too long for column 解决办法

    ERROR 1406 : Data too long for column 解决办法

    导入数据的时候,mysql报错 ERROR 1406 : Data too long for column Data too long for column
    2011-04-04
  • mysql unsigned 用法及相减出现补数溢出解决方法

    mysql unsigned 用法及相减出现补数溢出解决方法

    unsigned表示无符号的意思,也就是非负数,只用于整型并且unsigned 是MYSQL自定义的类型,非标准SQL。用途1是红苕说的起到约束数值的作用,2是可以增加数值范围(相当于把负数那部分加到正数上)。不过少用,不方便移植
    2012-04-04

最新评论