在 MySQL/MariaDB 中设置一列以使用 unix_timestamp() 更新 INT(11) 列
Setting up a column in MySQL/MariaDB to update an INT(11) column with the unix_timestamp()
是否可以在 MySQL 中设置一个列,以使用 上的当前 Unix 时间戳 值自动更新 INT(11) 列]更新?我尝试了一切,但似乎无法正常工作。我可以使用 unix_timestamp()
.
使其作为插入的默认值
您可以使用 DATETIME 或 TIMESTAMP 列执行此操作:
CREATE TABLE mytable (
id SERIAL PRIMARY KEY,
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP()
);
然后您可以查询它以获取 UNIX 时间戳,如下所示:
SELECT UNIX_TIMESTAMP(timestamp) AS ts FROM mytable;
MySQL 5.7 已经生成了列,但它不适用于非确定性函数:
mysql> ALTER TABLE mytable ADD COLUMN ts INT UNSIGNED AS (UNIX_TIMESTAMP(timestamp));
ERROR 3102 (HY000): Expression of generated column 'ts' contains a disallowed function.
您可以定义一个触发器:
mysql> ALTER TABLE mytable ADD COLUMN ts INT UNSIGNED;
mysql> CREATE TRIGGER ts BEFORE UPDATE ON mytable FOR EACH ROW SET NEW.ts = UNIX_TIMESTAMP(NEW.timestamp);
mysql> select * from mytable;
+----+---------------------+------+
| id | timestamp | ts |
+----+---------------------+------+
| 2 | 2020-07-23 23:09:57 | NULL |
+----+---------------------+------+
mysql> update mytable set id = 3;
mysql> select * from mytable;
+----+---------------------+------------+
| id | timestamp | ts |
+----+---------------------+------------+
| 3 | 2020-07-23 23:14:05 | 1595546045 |
+----+---------------------+------------+
您也应该在插入之前创建一个匹配的触发器。
没有
只有 timestamp
和 datetime
数据类型支持 on update
子句。
不过,在 MySQL 的最新版本中,您可以将自动更新的 timestamp
列与将其转换为 unix 时间戳的计算列相结合——这避免了对触发器的需要:
create table mytable (
id int primary key,
-- auto-updated timestamp colum
update_ts timestamp on update current_timestamp,
-- unix timestamp computed from the timestamp
unix_update_ts int as (timestampdiff(second, '1970-01-01', update_ts))
);
请注意,我们现在不能在计算列中使用 unix_timestamp()
; MySQL 似乎假设此函数的结果不是确定性的(当函数被赋予固定参数时这是不正确的) - 但我们可以使用 timestampdiff()
.
来解决这个问题
是否可以在 MySQL 中设置一个列,以使用 上的当前 Unix 时间戳 值自动更新 INT(11) 列]更新?我尝试了一切,但似乎无法正常工作。我可以使用 unix_timestamp()
.
您可以使用 DATETIME 或 TIMESTAMP 列执行此操作:
CREATE TABLE mytable (
id SERIAL PRIMARY KEY,
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP()
);
然后您可以查询它以获取 UNIX 时间戳,如下所示:
SELECT UNIX_TIMESTAMP(timestamp) AS ts FROM mytable;
MySQL 5.7 已经生成了列,但它不适用于非确定性函数:
mysql> ALTER TABLE mytable ADD COLUMN ts INT UNSIGNED AS (UNIX_TIMESTAMP(timestamp));
ERROR 3102 (HY000): Expression of generated column 'ts' contains a disallowed function.
您可以定义一个触发器:
mysql> ALTER TABLE mytable ADD COLUMN ts INT UNSIGNED;
mysql> CREATE TRIGGER ts BEFORE UPDATE ON mytable FOR EACH ROW SET NEW.ts = UNIX_TIMESTAMP(NEW.timestamp);
mysql> select * from mytable;
+----+---------------------+------+
| id | timestamp | ts |
+----+---------------------+------+
| 2 | 2020-07-23 23:09:57 | NULL |
+----+---------------------+------+
mysql> update mytable set id = 3;
mysql> select * from mytable;
+----+---------------------+------------+
| id | timestamp | ts |
+----+---------------------+------------+
| 3 | 2020-07-23 23:14:05 | 1595546045 |
+----+---------------------+------------+
您也应该在插入之前创建一个匹配的触发器。
没有
只有 timestamp
和 datetime
数据类型支持 on update
子句。
不过,在 MySQL 的最新版本中,您可以将自动更新的 timestamp
列与将其转换为 unix 时间戳的计算列相结合——这避免了对触发器的需要:
create table mytable (
id int primary key,
-- auto-updated timestamp colum
update_ts timestamp on update current_timestamp,
-- unix timestamp computed from the timestamp
unix_update_ts int as (timestampdiff(second, '1970-01-01', update_ts))
);
请注意,我们现在不能在计算列中使用 unix_timestamp()
; MySQL 似乎假设此函数的结果不是确定性的(当函数被赋予固定参数时这是不正确的) - 但我们可以使用 timestampdiff()
.