【问题标题】:php mysql timestampphp mysql时间戳
【发布时间】:2010-06-09 20:19:46
【问题描述】:

我需要跟踪在我的 mysql 数据库中创建用户的日期和时间。我有一个名为“created”的列,数据类型为 TIMESTAMP。

问题在于,当用户更改密码或其他信息时,TIMESTAMP 值会发生变化。我怎样才能将其设置为不更改????

【问题讨论】:

    标签: php mysql timestamp


    【解决方案1】:

    听起来您没有正确设置时间戳列:

    查看guide

    *
    
      Auto-initialization and auto-update:
    
      ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    
    *
    
      Auto-initialization only:
    
      ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    
    *
    
      Auto-update only:
    
      ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
    
    *
    
      Neither:
    
      ts TIMESTAMP DEFAULT 0
    

    【讨论】:

      【解决方案2】:

      您可能只想将其默认子句设置为CURRENT_TIMESTAMP(如其他答案中所述的@Mark 和@dcp):

      CREATE TABLE your_table (
         ...
         `created_timestamp` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
      );
      

      测试用例:

      CREATE TABLE tb (`a` int, `c` TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
      Query OK, 0 rows affected (0.04 sec)
      
      INSERT INTO tb (a) VALUES (1);
      Query OK, 1 row affected (0.01 sec)
      
      SELECT * FROM tb;
      +------+---------------------+
      | a    | c                   |
      +------+---------------------+
      |    1 | 2010-06-09 23:31:16 |
      +------+---------------------+
      1 row in set (0.00 sec)
      
      UPDATE tb SET a = 5;
      Query OK, 1 row affected (0.00 sec)
      Rows matched: 1  Changed: 1  Warnings: 0
      
      SELECT * FROM tb;
      +------+---------------------+
      | a    | c                   |
      +------+---------------------+
      |    5 | 2010-06-09 23:31:16 |
      +------+---------------------+
      1 row in set (0.00 sec)
      

      编辑:

      在我最初的回答中,我建议使用 DATETIME 列,并将 DEFAULT 子句设置为 CURRENT_TIMESTAMP。然而,这只有在使用 TIMESTAMP 数据类型时才有可能,如 stated in documentation

      数据类型规范中的DEFAULT value 子句表示列的默认值。除了一个例外,默认值必须是一个常量;它不能是函数或表达式。这意味着,例如,您不能将日期列的默认值设置为诸如NOW()CURRENT_DATE 之类的函数的值。例外情况是您可以将CURRENT_TIMESTAMP 指定为TIMESTAMP 列的默认值。

      【讨论】:

        【解决方案3】:

        使用日期时间列。时间戳自动更新。

        【讨论】:

          【解决方案4】:

          将其更改为DEFAULT CURRENT_TIMESTAMP,否则它将自动更新。来自manual

          在 CREATE TABLE 语句中,第一个 TIMESTAMP 列可以用以下任何一种方式声明:

          同时使用 DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP 子句,该列的默认值是当前时间戳,并且会自动更新。

          既没有 DEFAULT 也没有 ON UPDATE 子句,与 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 相同。

          使用 DEFAULT CURRENT_TIMESTAMP 子句且没有 ON UPDATE 子句时,该列的默认值具有当前时间戳,但不会自动更新。

          强调我的。

          【讨论】:

            【解决方案5】:

            将其设为日期时间?

            【讨论】:

              【解决方案6】:
              • 保持格式不变,但在插入时使用date() 正确格式化插入的字符串。
              • 那么当用户更改他们的信息时需要updating

              【讨论】:

                【解决方案7】:

                当你创建表时,你应该省略 ON UPDATE

                ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
                

                应该是

                ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                

                link

                【讨论】:

                  【解决方案8】:

                  在属性下,禁用“更新 CURRENT_TIMESTAMP”。

                  【讨论】:

                    【解决方案9】:

                    在你的情况下这有点脏,但你可以暂时禁用自动更新:

                    UPDATE woot SET password=<value_to_set>, timestamp_colum_name=timestamp_colum_name;
                    

                    (在那里找到它:http://www.xarg.org/2010/06/disable-on-update-current-timestamp-in-mysql/

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2023-03-07
                      • 2015-02-04
                      • 1970-01-01
                      • 2011-06-02
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多