有没有办法对计算值强制执行mysql检查约束

hec6srdp  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(310)

很抱歉,如果我的措辞非常尴尬/不适合程序员-我只是一个sql noob谁采取了初学者的课程。
我正在使用phpmyadmin设计一个电子商务数据库,其中客户的最小年龄是18岁。因为age是一个计算列,所以我想记录dob并强制执行check约束。我试过了,但没用:

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

我有个错误说:
函数或表达式“curdate()”不能在的check子句中使用 DOB 有没有办法对计算值强制执行mysql检查约束?

jv4diomz

jv4diomz1#

在mysql中, CHECK 约束适用于行的所有时间,而不仅仅是在插入或更新数据时。
如果您仔细阅读文档,您会发现这个“限制”:
允许使用文本、确定性内置函数和运算符。如果给定表中相同的数据,则函数是确定的,多个调用产生相同的结果,而与连接的用户无关。不确定且未通过此定义的函数示例:connection\u id()、current\u user()、now()。
您正在尝试使用这些不确定函数之一添加约束。这就是问题所在。
请注意,这并不是真正的“限制”。它是 check 约束。因为这些函数的值发生了变化,所以数据库无法保证行中存储的数据满足约束。你也许知道 now() 只会增加,一旦满足约束,则始终为真。数据库很难知道这一点。
也许最简单的解决方案是在将数据插入表时使用触发器来强制执行约束。

相关问题