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

标签 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 查询来检查这一点?

最佳答案

您想添加一个唯一约束,每个时间间隔只允许一个 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/

相关文章:

php - mysql pdo 中的一般错误

java - 简单键/值数据库的最佳存储引擎

database - 数据库中一对一和一对多关系的区别

mysql优化UPDATE JOIN性能指标

mysql - 为什么 myisam 比 Innodb 慢

php - 用我在 SQL 中的结果计算每天的总数

mysql - 比较同一个 SQL 表中的 2 列

sql 语句,现在 - unix/epoch 时间 6 个月

sql - 同一个表列上的多个外键?

database - 单独的应用程序和数据库服务器与一体机的性能