我有一个表,每次更新时都会在其中添加数千行。每行描述单个项目的当前值。
我想添加一个约束,只允许在特定时间跨度(例如一个小时)内为特定 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 查询来检查这一点?
最佳答案
您想添加一个唯一约束,每个时间间隔只允许一个 ItemID
,比如一个小时。您可以使用截断的时间戳来执行此操作。 UNIX_TIMESTAMP
返回“自 1-1-1970 以来的秒数”。如果你用 (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));
关于mysql - 如何在 MySQL 的多列唯一约束中将时间跨度指定为键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36132622/