【重学 MySQL】六十七、解锁检查约束,守护数据完整性

server/2024/10/24 1:53:37/

【重学 MySQL】六十七、解锁检查约束,守护数据完整性

  • 检查约束的基本概念
  • 检查约束的语法
  • 检查约束的使用场景
  • 注意事项
  • 示例

在这里插入图片描述
在MySQL中,检查约束(CHECK)是一种用于确保表中数据满足特定条件的约束。

检查约束的基本概念

检查约束用于限制表中列的值,以确保它们满足特定的条件。这些条件通常通过SQL表达式来定义,当插入或更新数据时,MySQL会验证这些表达式是否为真。如果表达式为假,则操作会被拒绝,从而保证了数据的完整性和有效性。

检查约束的语法

  1. 在创建表时添加检查约束

    • 语法格式:
      CREATE TABLE 表名 (列名 数据类型 CHECK (条件表达式),...
      );
      
    • 示例:
      CREATE TABLE users (id INT PRIMARY KEY,age INT CHECK (age >= 18)
      );
      

    在这个示例中,age列被添加了一个检查约束,确保age的值大于或等于18。

  2. 在修改表时添加检查约束

    • 语法格式:
      ALTER TABLE 表名 ADD CONSTRAINT 约束名 CHECK (条件表达式);
      
    • 示例:
      ALTER TABLE users ADD CONSTRAINT chk_age CHECK (age < 100);
      

    在这个示例中,向users表添加了一个名为chk_age的检查约束,确保age的值小于100。

  3. 删除检查约束

    • 语法格式:
      ALTER TABLE 表名 DROP CONSTRAINT 约束名;
      
    • 示例:
      ALTER TABLE users DROP CONSTRAINT chk_age;
      

    在这个示例中,从users表中删除了名为chk_age的检查约束。

检查约束的使用场景

检查约束通常用于以下场景:

  1. 限制列的值范围:例如,确保年龄字段的值在合理范围内(如18到100之间)。
  2. 确保数据的有效性:例如,确保电子邮件字段的值符合电子邮件的格式。
  3. 维护数据的一致性:例如,确保两个相关字段之间的值满足特定关系(如一个字段的值必须大于另一个字段的值)。

注意事项

  1. MySQL版本:检查约束在MySQL 8.0.16及更高版本中才得到全面支持。在之前的版本中,虽然可以添加检查约束,但MySQL不会对其进行验证。
  2. 复杂表达式:检查约束可以使用简单的表达式,也可以包含复杂的逻辑和子查询。但是,请注意性能问题,因为复杂的表达式可能会增加数据插入和更新的开销。
  3. 命名规范:为检查约束指定一个有意义的名称是一个好习惯,这有助于在需要时更容易地识别和管理约束。

示例

以下是一个综合示例,展示了如何在创建和修改表时使用检查约束:

-- 创建表时添加检查约束
CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),salary DECIMAL(10, 2) CHECK (salary > 0),hire_date DATE CHECK (hire_date >= '2000-01-01')
);-- 修改表时添加检查约束
ALTER TABLE employees ADD CONSTRAINT chk_salary_max CHECK (salary <= 100000);-- 尝试插入数据(合法)
INSERT INTO employees (id, name, salary, hire_date) VALUES (1, 'Alice', 50000, '2020-05-15');-- 尝试插入数据(不合法,salary小于0)
INSERT INTO employees (id, name, salary, hire_date) VALUES (2, 'Bob', -1000, '2021-06-20'); -- 会失败-- 尝试插入数据(不合法,hire_date小于2000-01-01)
INSERT INTO employees (id, name, salary, hire_date) VALUES (3, 'Charlie', 60000, '1999-12-31'); -- 会失败

在这个示例中,employees表在创建时添加了两个检查约束:一个确保salary大于0,另一个确保hire_date大于或等于2000-01-01。然后,通过ALTER TABLE语句添加了一个额外的检查约束,确保salary小于或等于100000。最后,尝试插入一些数据来演示检查约束的效果。


http://www.ppmy.cn/server/134319.html

相关文章

界面耻辱纪念堂--可视元素04

当我们第一次注意到 Visual Basic 5.0 菜单的动画效果“特性”时&#xff0c;我们只能嘲笑这种特性的傻气。事实上&#xff0c;我们并不觉得特性本身傻气&#xff0c;而是微软为这个特性投资&#xff0c;然后将这个特性应用到他们所有的主流产品&#xff08;例如&#xff0c;Of…

上传文件到云存储前端报错413 Request Entity Too Large

访问上传接口控制台报错 详细原因 net::err_connection_reset&#xff0c;于是用postman测试报错 nginx 413 Request Entity Too Large 这个报错就很明显了&#xff0c;nginx对上传文件的大小有了限制&#xff0c;去看看nginx的配置就知道了。 client_max_body_size 100M; 设置…

【数学二】一元函数积分学-定积分的应用-平面图形面积、旋转体体积、函数的平均值、平面曲线的弧长、旋转曲面面积

考试要求 1、理解原函数的概念&#xff0c;理解不定积分和定积分的概念. 2、掌握不定积分的基本公式&#xff0c;掌握不定积分和定积分的性质及定积分中值定理&#xff0c;掌握换元积分法与分部积分法. 3、会求有理函数、三角函数有理式和简单无理函数的积分. 4、理解积分上限…

【Flutter】基础组件:文本及样式

在 Flutter 开发中&#xff0c;文本是最基本的 UI 元素之一。无论是简单的标题&#xff0c;还是复杂的富文本展示&#xff0c;Flutter 提供了强大的 Text 和相关的样式工具来满足开发需求。本教程将深入介绍 Text、TextStyle、TextSpan、DefaultTextStyle 及字体等内容&#xf…

【数据结构】滑动窗口算法详解:高效解决子串问题

滑动窗口&#xff08;Sliding Window&#xff09;是一种常用于处理数组或字符串中子序列问题的算法技巧。它通过维护一个窗口来限制待处理的数据范围&#xff0c;从而高效地解决问题&#xff0c;避免重复计算。它的时间复杂度通常为 O(N)&#xff0c;相较于暴力破解&#xff08…

部署harbor问题(缺少ssl认证证书)

在部署harbor服务&#xff0c;/install.sh启动时&#xff0c;缺少ssl认证 1. 创建证书目录 首先&#xff0c;创建 /usr/local/harbor/ssl 目录&#xff1a; mkdir -p /usr/local/harbor/ssl 2. 生成私钥 生成一个 4096 位的 RSA 私钥&#xff1a; openssl genrsa -out /us…

Git 分支操作-开发规范

一、背景 在实际开发中&#xff0c;一般在主分支的基础上单独创建一个新的分支进行开发&#xff0c;最后合并到master分支&#xff0c;而不是直接在master分支进行开发。 二、新建分支 1、初始状态&#xff0c;local为本地分支&#xff0c;remote为远程分支 2、单击 “Remot…

更新项目vue版本--入门篇

今天想用下ElementPlus的Form表单&#xff0c;结果给我 Extraneous non-props attributes (ref_key) were passed to component but could not be automatically inherited because component renders fragment or text root nodes. 这样一个警告 出现这个警告跟vue版本有关&a…