如何在MySQL的多个列的唯一约束中将时间跨度指定为键?

时间:2016-03-21 13:40:59

标签: mysql sql database

我有一个表,每次更新时都会添加数千行。每行描述单个项目的当前值。

我想添加一个约束,该约束仅允许在某个时间跨度内为某个ItemID添加1个插入,例如一小时。

换句话说,我希望我的表格中的一列" itemID" " timespan" 是唯一的我桌子的约束。

所以我想我会以某种方式添加这样的东西:

BETWEEN DATE_ADD(NOW(),INTERVAL -1 HOUR) AND NOW() AS timespan

当我改变我的表时(" itemID"无关紧要,只是我表中的一列")

ALTER TABLE `items_update` ADD UNIQUE `unique_timespan`(`itemID`, `timespan`);

可以吗?或者我是否必须创建一个嵌套的INSERT查询来检查这个?

1 个答案:

答案 0 :(得分:1)

您想添加一个唯一约束,每个时间间隔只允许一个ItemID,比如一小时。您可以使用截断的时间戳来完成此操作。 UNIX_TIMESTAMP返回自1970年1月1日以来的秒数。如果用(60 * 60)进行整数除法,则得到“自1-1-1970以来的小时数”。这可以用于约束:

INSERT INTO myTable (ItemId, timespan)
VALUES (1, FLOOR(UNIX_TIMESTAMP() / 60 / 60));

ALTER TABLE myTable ADD CONSTRAINT UNIQUE (ItemId, timespan);

此解决方案非常灵活,它可以让您轻松地使用您想要的任何时间间隔,例如35米或1天1小时1分钟。

您也可以在约束中执行截断,但这可能会导致大型数据集出现性能问题。

 ALTER TABLE myTable ADD CONSTRAINT UNIQUE (ItemId, FLOOR(updatedTime / 60 / 60));