当还需要年份字段时,强制执行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

当数据库强制加入时,如何强制执行更好的执行计划?

当还涉及迁移时,如何使用 django 进行同步数据库

mysql 根据起止年份 查询所选年份数据

PHP DateTime::__construct():当年份为三位数字时,无法解析时间字符串

mysql添加DATETIME类型字段导致Invalid default value错误的问题