我正在尝试创建一个包含时间戳列和虚拟(计算)列的表,该列包含一个辅助键,用于对具有同一小时时间戳的行进行分组。为此,我在 MariaDB/MySql 中使用以下命令:
CREATE TABLE mytable(t TIMESTAMP, u INT AS (UNIX_TIMESTAMP(t) DIV 3600);
返回以下错误:
ERROR 1901 (HY000): Function or expression is not allowed for column 'u'
根据文档,我看不出这不起作用的原因。有什么想法吗?
最佳答案
替换这个...
(UNIX_TIMESTAMP(t) DIV 3600)
...有了这个...
(TIMESTAMPDIFF(HOUR,'1970-01-01 00:00:00',t))
已在 MariaDB 10.1.14 上验证,这应该适用于任何更高版本。
由于 UNIX_TIMESTAMP()
中的 1970-01-01 00:00:00
为 0
,并且 DIV 3600
code> 是整数除法,您的表达式似乎相当于自 1970-01-01 00:00:00 以来的小时数 FLOOR()
... 和 TIMESTAMPDIFF()
似乎提供了相同的值。
MariaDB 似乎将 UNIX_TIMESTAMP()
视为不确定性,这在提供参数时是不正确的。 MySQL 核心可能缺乏考虑“有时是确定性的”内置函数的能力,或者这可能是一个错误。
但我相信您可以使用 TIMESTAMPDIFF()
找到可行的解决方法。
另请注意,您似乎需要 PERSISTENT
关键字,否则无法对虚拟列建立索引,因为未存储该值。
ERROR 1901: Key/Index cannot be defined on a non-stored computed column
关于mysql - 在 MariaDB/MySql 的虚拟(计算)列中使用 UNIX_TIMESTAMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43167009/