【问题标题】:Setting up a column in MySQL/MariaDB to update an INT(11) column with the unix_timestamp()在 MySQL/MariaDB 中设置列​​以使用 unix_timestamp() 更新 INT(11) 列
【发布时间】:2020-11-13 18:37:03
【问题描述】:

是否可以在 MySQL 中设置一个列以在 UPDATE 上使用当前 Unix 时间戳 值自动更新 INT(11) 列?我尝试了一切,但似乎无法让它工作。我可以使用unix_timestamp() 将其作为插入的默认值。

【问题讨论】:

    标签: mysql timestamp sql-update mariadb epoch


    【解决方案1】:

    没有。

    只有timestampdatetime 数据类型支持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() 解决这个问题。

    【讨论】:

      【解决方案2】:

      您可以使用 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 |
      +----+---------------------+------------+
      

      您也应该在插入之前创建一个匹配的触发器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-20
        相关资源
        最近更新 更多