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

Is there a way to enforce the MySQL CHECK constraint for calculated value

抱歉,如果我的措辞对程序员来说非常 awkward/non-fitting - 我只是一个 SQL 初学者 class。

我正在使用 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约束的定义。因为这些函数的值是变化的,所以数据库无法保证行中stored的数据满足约束。您可能知道 now() 只会增加,一旦满足约束条件,它就始终为真。数据库很难知道这一点。

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