首页
学习
活动
专区
圈层
工具
发布

mysql中check约束

基础概念

MySQL中的CHECK约束是一种数据完整性约束,用于限制表中某一列的值必须满足特定的条件。CHECK约束可以确保数据的准确性和一致性,防止插入或更新不符合条件的数据。

相关优势

  1. 数据完整性CHECK约束确保表中的数据符合预定义的条件,从而维护数据的完整性和准确性。
  2. 防止错误数据:通过定义CHECK约束,可以防止插入或更新不符合条件的数据,减少错误数据的出现。
  3. 简化应用逻辑:在数据库层面定义数据完整性规则,可以简化应用程序中的数据验证逻辑。

类型

MySQL中的CHECK约束主要分为两种类型:

  1. 列级约束:针对单个列定义的CHECK约束。
  2. 表级约束:针对整个表定义的CHECK约束。

应用场景

CHECK约束常用于以下场景:

  1. 年龄范围:例如,在用户表中,可以定义一个CHECK约束来确保用户的年龄在合理的范围内(如18到100岁)。
  2. 数据格式:例如,在电话号码列中,可以定义一个CHECK约束来确保电话号码符合特定的格式。
  3. 业务规则:例如,在订单表中,可以定义一个CHECK约束来确保订单的总金额不为负数。

示例代码

以下是一个简单的示例,展示如何在MySQL中创建带有CHECK约束的表:

代码语言:txt
复制
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT CHECK (age >= 18 AND age <= 100),
    email VARCHAR(100) UNIQUE
);

在这个示例中,我们创建了一个名为users的表,并为age列定义了一个CHECK约束,确保年龄在18到100岁之间。

常见问题及解决方法

问题:为什么MySQL中的CHECK约束不起作用?

原因

  1. MySQL版本:在某些旧版本的MySQL中,CHECK约束可能不被支持或存在bug。
  2. 约束定义错误CHECK约束的定义可能存在语法错误或逻辑错误。
  3. 触发器绕过:某些情况下,通过触发器或其他方式绕过了CHECK约束。

解决方法

  1. 检查MySQL版本:确保你使用的MySQL版本支持CHECK约束。建议使用最新版本的MySQL。
  2. 验证约束定义:仔细检查CHECK约束的定义,确保语法正确且逻辑合理。
  3. 禁用触发器:如果使用了触发器,请尝试禁用它们,以确定是否是触发器绕过了CHECK约束。

示例代码(验证约束定义)

假设我们有一个表orders,其中有一个列total_amount,我们希望确保这个列的值不为负数:

代码语言:txt
复制
CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    total_amount DECIMAL(10, 2) CHECK (total_amount >= 0)
);

在这个示例中,我们定义了一个CHECK约束来确保total_amount列的值不为负数。

参考链接

MySQL CHECK 约束

希望这些信息对你有所帮助!如果你有其他问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

CHECK约束_数据库check约束怎么写

在字段定义后添加CHECK 表达式就可以为这个字段添加CHECK约束,几乎所有字段中都可以添加CHECK约束,也就是一张表中可以存在多个CHECK 约束。...(FWorkYear>0)”这个CHECK约束,所以在数据库中执行此SQL语句后数据库会报出下面错误信息: INSERT 语句与CHECK 约束”CKT_PersonFWorkY__24927208″冲突...约束中使用常量表达式之外,还可以在CHECK 约束中使用函数,比如人员编号长度要大于12,那么就需要如下编写建表语句: MYSQL,DB2: CREATE TABLE T_Person (FNumber...(FWorkYearCHECK约束的,所以在数据库中执行此SQL语句后数据库会报出下面错误信息: INSERT 语句与 CHECK 约束”ck_1″冲突。...,所以可以通过下面的SQL语句将CHECK约束ck_2删除(这个语句在MYSQL中无效): ALTER TABLE T_Person DROP CONSTRAINT ck_2; 发布者:全栈程序员栈长,

2.6K30
  • MySQL 8.0有趣的新特性:CHECK约束

    1.功能说明 2.建议使用CHECK约束的场景 1.功能说明 在MySQL 8.0.16以前, CREATE TABLE允许从语法层面输入下列CHECK约束,但实际没有效果: CHECK (expr)...在 MySQL 8.0.16,CREATE TABLE添加了针对所有存储引擎的表和列的CHECK约束的核心特性。..._0900_ai_ci SQL规范要求:所有约束(包括:PRIMARY KEY, UNIQUE,FOREIGN KEY, CHECK)属于同一个命名空间(NAMESPACE),在MySQL实现中,所有的约束类型在每个...SQL模式下,可能返回不同的结果 另外,在INFORMATION_SCHEMA的CHECK_CONSTRAINTS表中存放着所有表中定义的CHECK约束的信息。...2.建议使用CHECK约束的场景 复杂业务场景下的约束,从架构角度看,允许有不同的实现方式: 放在数据库表中,通过约束实现,但不支持子查询 放在数据库中,通过触发器(TRIGGER)实现 放在应用程序的逻辑中

    1.9K30

    数据库 SQL 约束之 CHECK

    SQL 约束的定义 SQL 约束用于规定表中的数据规则。如果存在违反约束的数据行为,行为会被约束终止。...约束可以在创建表时规定(通过 CREATE TABLE 语句),或者在表创建之后规定(通过 ALTER TABLE 语句)。 SQL CHECK 约束 CHECK 约束用于限制列中的值的范围。...如果对单个列定义 CHECK 约束,那么该列只允许特定的值。 如果对一个表定义 CHECK 约束,那么此约束会基于行中其他列的值在特定的列中对值进行限制。...CHECK 约束 1、当表已被创建,定义单个列的 CHECK 约束 实例 ALTER TABLE student ADD CHECK(ID); 2、当表已被创建,定义多个列的 CHECK 约束 实例...TABLE student DROP CHECK chk_Person; 至此,数据库 SQL CHECK(检查) 约束就讲完啦,下一篇讲《数据库 SQL DEFAULT(默认) 约束》。

    1.1K20

    MySQL 约束

    在表中某个列的定义后加上关键字 NOT NULL 作为限定词,来约束该列的取值不能为空。...唯一约束在一个表中可有多个,并且设置唯一约束的列允许有空值,但是只能有一个空值。...一个表中只能有一个字段使用 AUTO_INCREMENT 约束,且该字段必须有唯一索引,以避免序号重复(即自动增长只能给 primary key 或者 unique 添加,一张表中只能添加一个)。...对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。...在表中插入一条新记录时,如果没有为某个字段赋值,系统就会自动为这个字段插入默认值。默认值约束通常用在已经设置了非空约束的列,这样能够防止数据表在录入数据时出现错误。

    4.2K31

    MySQL约束

    约束是按照约定(特定)条件限制,管束等意思。约束的作用是添加、删除。 在数据库中对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。...1.2、约束作用 对表中的数据进行限制,保证数据的正确性、有效性和完整性。一个表如果添加了约束,不正确的数据将无法插入到表中。约束在创建表的时候添加比较合适。...1.3、约束分类 主键 primary key 唯一 unique 非空 not null 默认值 default 外键 foreign key 检查约束 check 二、主键约束...= 字段名1), 字段名1 字段类型 check (表达式), 字段名2 字段类型 constraint 唯一约束名 check (表达式) [not enforced] ); 注意: 表达式中可以包含该字段名...约束删除 格式: alter table 数据库表名 drop check 检查约束名; 案例: 删除t6表中的检查约束t6_check_phone mysql> alter table t6 drop

    8.2K10

    MySQL 约束

    ); 创建检查约束 在 MySQL 8.0.16 之前,CREATE TABLE 仅允许以下有限版本的表 CHECK 约束语法,该语法将被解析并忽略: CHECK (expr) 从 MySQL 8.0.16...这意味着约束冲突将被记录下来,但不会影响插入、更新或删除数据的操作。 CHECK 约束可指定为表约束或列约束: 表约束不会出现在列定义中,并且可以引用任何表列。...CHECK (c1 c2) 是表约束:它出现在任何列定义之外,因此它可以(并且确实)引用多个表列。 此约束包含对尚未定义的列的前向引用。没有指定约束名称,因此 MySQL 生成一个名称。...在 MySQL 中,通常情况下,这个值通常为 def,因为 MySQL 不使用目录的概念。 CONSTRAINT_SCHEMA:这是包含约束的数据库的名称。它指定了约束所属的数据库。...5.删除约束 要删除 MySQL 表中的约束,可以使用 ALTER TABLE 语句并指定要删除的约束类型和名称。

    4.4K10

    MySQL 约束

    核心目标: 学习如何使用约束来强制执行 MySQL 表中数据的完整性和规则,确保数据的准确性、一致性和可靠性。 什么是约束? 约束是在表的数据列上强制执行的规则。...它们用于限制可以插入、更新或删除到表中的数据类型或值。如果任何操作违反了约束规则,该操作将被中止。 约束的类型: 1. NOT NULL (非空约束) 作用:确保列不能存储 NULL 值。...NO ACTION: 同 RESTRICT (标准 SQL 的概念,MySQL 中行为类似)。 SET DEFAULT: 父表记录删除/更新时,将子表中相应的外键列设置为其默认值。...CHECK (检查约束) 作用:定义一个布尔表达式,用于验证插入或更新到列中的数据。只有当表达式结果为 TRUE 或 UNKNOWN (由于 NULL) 时,操作才被允许。...(MySQL 8.0.16+ 才真正强制执行) 语法 (建表时 - 列级): column_name data_type CHECK (condition) 语法 (建表时 - 表级): CONSTRAINT

    62410

    MySQL约束

    约束 约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。...非空约束 (not null 被设置非空约束的字段值不能为空) - 建表时添加非空约束: - create table student( - id int not null, - id_number...唯一约束 (unique 被设置唯一约束的字段值不能重复,但是可以为空) - 建表时添加唯一约束 - create table student( - id int, - id_number...varchar(25) unique -- 给id_number设置唯一约束 - ); 查看唯一约束:show index from 表名; 删除唯一约束:alter table 表名 drop index...字段名; 创建表之后添加唯一约束:alter table 表名 modify 字段名 数据类型 unique; 主键约束 (primary key 同时保证了唯一和非空) - 创建表时添加主键约束

    2.6K20

    MySQL中的约束和存储引擎

    约束(Constraint) 在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。 常见的约束有哪些呢?...主键约束(primary key):约束的字段不能重复 外键约束(foreign key):简称FK 检查约束(check) :注意oracle数据库有check约束,但是mysql没有,目前mysql...int primary key, username varchar(255), email varchar(255) ) ; 根据以上的测试得出:id是主键,因为添加了主键约束,主键约束中的数据不能为...MySql默认使用的存储引擎是InnoDB方式。默认采用的字符集是UTF8。 什么是存储引擎呢? 存储引擎这名字只有在mysql中存在。(oracle中有相应的机制,但是不叫做存储引擎。...Oracle中没有特殊的名字,就是”表的存储方式”) Mysql支持很多存储引擎,每一个存储引擎都对应了一种不同的存储方式。 每一个存储引擎都有自己的优缺点,需要在合适的时机选择合适的存储引擎。

    2.9K10

    MySQL中sp运行check表版本更新流程解析

    MySQL> call p1; Query OK, 0 rows affected (34.24 sec) 二、代码跟踪 现在跟踪一下这个sp看看上面在哪里check表版本并且能正确执行reprepare...rc) return false; thd->clear_error(); invalidate(); } } #跟踪代码发现有一个check_and_update_table_version...函数是用来check表版本是否一致的 #打印堆栈看一下代码调用过程: Thread 51 "mysqld" hit Breakpoint 6, check_and_update_table_version.../sql/sp_head.cc:2977 #可以发现open_tables函数调用了这个函数,这个函数调用了ask_to_reprepare, #在sp运行中这个ask_to_reprepare返回的是...四、总结 在MySQL的sp操作中涉及表操作的sql语句一定会执行check_and_update_table_version这个函数,每次会根据这个函数的结果来确定要不要重新parse该sql语句,如果没有版本改变就直接进行

    1.9K30

    初识MySQL · 约束

    前言: 对于约束来说,是一种限制数据的方式,这里的约束和生活中的约束是差不多的,比如数据来说,生活中的语文成绩在150以内,0分以上,如果有谁给你说我语文考了151分,那指定是扯淡,同样的,拿我们班级中的学号来举例...在MySQL中就可以通过主键或者是唯一键来约束数据不能重复,等等等等。 说白了,我们学习这里的约束和结合生活中的场景是非常容易理解的,那么话不多说,我们直接进入主题。...对于初学MySQL的同学来说看到10肯定是蒙蔽的,我们从数据的大小,int的大小是4字节,和10也没有关系。...你想,一个班级中,每个学生都应该有一个独一无二的东西吧?那就是学号,如果是名字的话,是有可能重复的,那么主键的含义就是表示表中的该数据是独一无二的,不能有重复的,不能为空等。...实则不然,你想,主键的唯一性是用来保证该字段在表中的特殊性,即一种标志,而唯一键更多的是保证业务中的不可重复性,比如一个班级,学号是硬通货,点名的时候,通报的时候我们都可以使用学号,这是因为这个场景我们使用学号最好

    1.4K00

    【MySQL】约束类型

    ,应优先为关键业务字段添加 对于可选信息(如用户的昵称、备注)不应设置非空约束 MySQL中,字符串类型的非空列如果未指定默认值,插入时必须显式提供值 2...., '女')), -- 性别只能是男女 ); 数据库兼容性: MySQL 5.7及之前版本:会解析CHECK约束但不生效(忽略检查) MySQL 8.0及以上版本:完全支持CHECK约束 PostgreSQL...、Oracle、SQL Server:完全支持CHECK约束 使用建议: 由于MySQL的版本兼容性问题,重要的检查逻辑建议同时在应用层实现 检查条件应保持简单,复杂逻辑更适合在业务代码中处理 对于格式验证...查看表中的约束 通过数据库系统表可以查询表中已定义的约束: -- MySQL中查看约束 SELECT CONSTRAINT_NAME, COLUMN_NAME, CONSTRAINT_TYPE...版本兼容性处理 MySQL 5.7中用枚举(ENUM)替代CHECK约束: CREATE TABLE student ( gender ENUM('男', '女') NOT NULL -- 等效于

    44510

    MySQL 约束介绍

    唯一性约束允许列值为空。 在创建唯一约束的时候,如果不给唯一约束命名,就默认和列名相同。 MySQL会给唯一约束的列上默认创建一个唯一索引。...字段名 字段类型 UNIQUE; 3、主键约束 用来唯一标识表中的一行记录 主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值 一个表最多只能有一个主键约束 主键约束对应着表中的一列或者多列...从表”中指定外键约束,并且一个表可以建立多个外键约束 当创建外键约束时,系统默认会在所在的列上建立对应的普通索引,索引名是外键的约束名,删除外键约束后,必须手动删除对应的索引 CREATE TABLE...)的数据类型必须与主表名(被参考字段)的数据类型一致,逻辑意义也一样 #(从表的某个字段)的字段名可以与主表名(被参考字段)的字段名一样,也可以不一样 -- FOREIGN KEY: 在表级指定子表中的列...-- REFERENCES: 标示在父表中的列 约束等级 Cascade方式:在父表上update/delete记录时,同步update/delete掉子表的匹配记录 Set null方式:在父表上update

    3K41

    MySQL-约束

    概述 概念 约束是作用在表中字段的规则 目的 保证数据库中数据的正确、有效和完整性 分类 约束是作用在表中字段上的,可以再创建表/修改表的时候添加约束 约束演示 请按照一下要求完成数据表结构的创建...primary key auto_increment comment '主键', name varchar(10) not null unique comment '姓名', age int check...INSERT INTO yonghu (name, age, status, gender) value ('小昭', 132, '1', '女'); 系统依然报错: 存在check约束函数 当然约束函数在一些软件中实现了可视化操作...: 上面是修改前的员工表和部门表,然后我现在将部门表中的 人力资源部的对应编号改成6: 那么此时在 UPDATE CASCADE 的约束下,员工表中外键相关联的数据也应该发生变化: SET NULL 使用...SET NULL命令,此时在该约束下,修改了父表之后就会自动检查外键所在的表,与之关联的字段值就会设置为null 将部门表中的人力资源部删除,在更新员工表中的数据,此时: 不难发现,外键字段原先的1,

    36510
    领券