当还需要年份字段时,强制执行Datetime和ID uniqe键

问题描述 投票:1回答:1

所以我为每一行都有一个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密钥?

mysql indexing
1个回答
2
投票

不能。您不能在列的一部分或应用于列的函数结果(在这种情况下为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)独特钥匙。

© www.soinside.com 2019 - 2024. All rights reserved.