如果我的措辞非常尴尬/不适合程序员,我深表歉意 - 我只是一个参加初学者类(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/