我需要知道如何在一个字段中添加CONSTRAINT,并确保它们是18岁以上的字段。
通过加入ID和姓氏来制作PersonID,我可以看到以下内容如何工作,但我如何让它工作以确保一个人的出生日期为18岁或以上
ALTER TABLE Persons
ADD CONSTRAINT uc_PersonID UNIQUE (P_Id,LastName);
我知道如何查看DOB
SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(dob, '00-%m-%d')) AS age FROM `members`
但是如何将其添加到ADD CONSTRAINT中。
答案 0 :(得分:1)
简单约束之外的任何内容(如外键引用)通常在DBMS中使用triggers完成。
before
和insert
操作需要update
触发器,以确保如果这两个中的任何一个尝试将年龄设置为低于18,则会失败。
如果您只想强制该列是特定的最小值,您只需在insert
或update
触发器中对其进行修改:
new.colname = 18
或保留update
触发器中的内容:
new.colname = old.colname
要强制失败,您可以在触发器内raise a signal。
顺便说一句,在数据库中存储 age 是非常不寻常的(如果这确实是你正在做的事情),因为这显然是需要每年更新的东西。一个更明智的方法是存储不更改的生日,并简单地将年龄作为计算字段。
答案 1 :(得分:0)
一般来说,它被认为是实施&#34;业务逻辑&#34;的最佳实践。比如在应用程序中,而不是在数据库中。数据库约束通常只应用作预防措施,以确保无效数据无法进入您的数据库:例如,它们可用于确保外键引用有效对象,所需值不是不合适的空或零,等等。在正常操作下,不可能导致从前端&#34;违反约束。你的申请。
其中一个主要原因是,通常很难将数据库错误(例如,invalid value for column 'age'
或某种类型的错误)转换为可以有效地向用户显示的错误(例如,对话框)说&#34;你必须年满18岁才能继续#34;)。此外,通常很难甚至不可能允许数据库约束的例外情况,或者允许现有的违规行为在&#34;何时引入新约束。
所以...... 不要这样做。检查用户应用程序中处理创建用户的部分(例如,您的注册脚本)的年龄,和/或允许更改其年龄的任何其他部分;或者在代表您的应用程序中的用户的对象中。