mysql - 有没有办法对计算值强制执行 MySQL CHECK 约束

标签 mysql sql database database-design check-constraints

如果我的措辞非常尴尬/不适合程序员,我深表歉意 - 我只是一个参加初学者类(class)的 SQL 菜鸟。

我正在使用 PHPMyAdmin 设计一个电子商务数据库,其中客户的最低年龄为 18 岁。因为年龄是一个计算列,所以我想记录 DOB 并强制执行 CHECK 约束。我试过了,但没用:

CREATE TABLE Customer(
    ...
    DOB date NOT NULL CHECK(DATEDIFF(year, CURDATE(), DOB))>=18),
    ...);

我收到一条错误消息:

Function or expression 'curdate()' cannot be used in the CHECK clause of DOB

有没有办法对计算值强制执行 MySQL CHECK 约束?

最佳答案

在 MySQL 中,CHECK 约束适用于一行的所有时间,而不仅仅是在插入或更新数据时。

如果你仔细阅读文档,你会发现这个“限制”:

  • Literals, deterministic built-in functions, and operators are permitted. A function is deterministic if, given the same data in tables, multiple invocations produce the same result, independently of the connected user. Examples of functions that are nondeterministic and fail this definition: CONNECTION_ID(), CURRENT_USER(), NOW().

您正在尝试使用这些非确定性函数之一添加约束。这就是问题所在。

请注意,这并不是真正的“限制”。它是 check 约束的定义。由于这些函数的值发生变化,数据库无法保证行中存储 的数据满足约束条件。您可能知道 now() 只会增加,一旦满足约束条件,它就始终为真。数据库很难知道这一点。

也许最简单的解决方案是在向表中插入数据时使用触发器来强制执行约束。

关于mysql - 有没有办法对计算值强制执行 MySQL CHECK 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62737282/

相关文章:

mysql - 我有一个包含非英语单词的文本文件,我需要将其放入 mysql 中,我该怎么办?

mysql - 如何在mySQL上找到不规则的增加

SQL 3 加入 group by 和 sum 函数

php - sql多插入函数参数无效错误

mysql - 创建 Amazon RDS 数据库的本地副本

mysql - golang MySQL segfaulting 一旦抽象

Mysql:ALTER TABLE而不锁定表?

sql-server - 获得对 xp_cmdshell 的执行权限

sql - 当单个列包含来自 2 个不同表的值时如何获取数据?

mysql - 使用两个单独的类别表优化数据库