1

I am trying to create a table with a timestamp column and a virtual (calculated) column that holds a helper key for grouping the rows with timestamps of the same hour. For that I am using the following command in MariaDB / MySql:

CREATE TABLE mytable(t TIMESTAMP, u INT AS (UNIX_TIMESTAMP(t) DIV 3600);

Which returns the following error:

ERROR 1901 (HY000): Function or expression is not allowed for column 'u'

According to the documentation i don't see a reason this should not work. Any ideas?

4

1 回答 1

1

换这个...

(UNIX_TIMESTAMP(t) DIV 3600)

...有了这个...

(TIMESTAMPDIFF(HOUR,'1970-01-01 00:00:00',t))

在 MariaDB 10.1.14 上进行了验证,这应该可以在任何更高版本中使用。

由于1970-01-01 00:00:000in UNIX_TIMESTAMP(),并且DIV 3600是整数除法,因此您的表达式似乎等于FLOOR()自 1970-01-01 00:00:00... 以来的小时数...并且TIMESTAMPDIFF()似乎提供了相同的值。

MariaDB 似乎被UNIX_TIMESTAMP()认为是不确定的,当提供参数时这是不正确的。MySQL 核心可能缺乏考虑“有时是确定性”的内置函数的能力,或者这可能是一个错误。

但我相信你有一个可行的解决方法,使用TIMESTAMPDIFF().

另请注意,您似乎需要PERSISTENT关键字,否则无法索引虚拟列,因为未存储该值。

ERROR 1901: Key/Index cannot be defined on a non-stored computed column
于 2017-04-02T14:20:14.250 回答