当还需要年份字段时,强制执行Datetime和ID uniqe键
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当还需要年份字段时,强制执行Datetime和ID uniqe键相关的知识,希望对你有一定的参考价值。
所以我为每一行都有一个USER_ID字段和一个OBJECT_ID,以及一个DateTime字段。 OBJECT_ID和USER_ID都有一个约束唯一键,以防止用户对该对象的多次使用。
我现在需要添加一个DateTime字段,就像用户使用该对象时一样。
我还需要按年限制使用量。例如:
USER_ID:3 OBJECT_ID:2年:2018年日期:01-02-2018
制作USER_ID,OBJECT_ID和YEAR将解决我的问题,因为USER 3每年都可以使用OBJECT 2一次。
我的困境是数据的耦合。 (YEAR,DATETIME)有没有办法以某种方式强制执行智能密钥,以便我可以从DATETIME中推断2018并强制执行uniqe密钥?
不能。您不能在列的一部分或应用于列的函数结果(在这种情况下为datetime
的年份)上创建键。您需要创建一个YEAR(4)
列并更改现有的UNIQUE键以使用它。
但是,如果您正在使用mysql 5.7或更高版本(并说innodb),您可以为YEAR创建一个虚拟生成列,并添加填充现有日期时间的数据 - 这样您就不需要手动设置或维护它在你的代码中。
只要UNIQUE
密钥不是主键,就可以使用其中的虚拟列,如:
ALTER TABLE your_table
ADD COLUMN virtual_year YEAR(4) GENERATED ALWAYS AS (DATE(`actual_datetime`)) VIRTUAL
然后添加密钥将是:
ALTER TABLE your_table
ADD UNIQUE KEY `user_id_object_id_vitual_year` (user_id, object_id, the_year)
然后放下你缺乏一年的旧(user_id, object_id)
独特钥匙。
以上是关于当还需要年份字段时,强制执行Datetime和ID uniqe键的主要内容,如果未能解决你的问题,请参考以下文章
强制实体框架使用 datetime 而非 datetime2