首页 > 数据库 > mysql教程 > 为什么MySQL CHECK约束在8.0.16之前的版本中失败?

为什么MySQL CHECK约束在8.0.16之前的版本中失败?

Patricia Arquette
发布: 2025-01-10 10:43:43
原创
313 人浏览过

Why Do MySQL CHECK Constraints Fail in Versions Before 8.0.16?

MySQL CHECK约束失效问题

在定义数据库表时,添加约束来保证数据完整性非常重要。CHECK约束允许您指定特定列的值必须满足的条件。然而,在MySQL 8.0.15及更早版本中,CHECK约束并未被强制执行,这是一种特殊情况。

举例说明:

<code class="language-sql">CREATE TABLE Customer (
  SD integer CHECK (SD > 0),
  Last_Name varchar (30),
  First_Name varchar(30)
);</code>
登录后复制

创建此表后,尝试插入SD值为负数的行:

<code class="language-sql">INSERT INTO Customer values ('-2', 'abc', 'zz');</code>
登录后复制

MySQL不会报错,即使插入的值违反了指定的CHECK约束。这是因为根据MySQL参考手册:

<code>CHECK子句会被解析,但所有存储引擎都会忽略它。</code>
登录后复制

解决方案:

为了解决这个问题,您可以采取以下方法之一:

  • 升级到MySQL 8.0.16或更高版本: 此版本开始支持CHECK约束。请参阅MySQL文档了解更多详情。
  • 实现触发器: 触发器可以用来强制存储引擎忽略的约束。创建一个在插入之前检查SD值的触发器,如下所示,可以有效地强制执行约束:
<code class="language-sql">mysql> delimiter //
mysql> CREATE TRIGGER trig_sd_check BEFORE INSERT ON Customer 
    -> FOR EACH ROW 
    -> BEGIN 
    -> IF NEW.SD <=0 THEN SET NEW.SD=0; 
    -> END IF; 
    -> END
    -> //
mysql> delimiter ;</code>
登录后复制

请注意,上面的触发器示例将负数的SD值设置为0,您可以根据实际需求修改触发器逻辑。

以上是为什么MySQL CHECK约束在8.0.16之前的版本中失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板