【问题标题】:Insert current date on insert在插入时插入当前日期
【发布时间】:2017-04-01 02:09:13
【问题描述】:

我有一个结构如下的表:

+----+-------------+----------------+------------+------------+
| id | some column | another column |  inserted  |   edited   |
+----+-------------+----------------+------------+------------+
| 1  | ...         | ...            | 2014-08-15 | 2016-03-04 |
| 2  | ...         | ...            | 2015-09-16 | 2016-10-07 |
| 3  | ...         | ...            | 2016-10-17 | 2016-11-16 |
+----+-------------+----------------+------------+------------+

插入新条目时,应将当前日期添加到inserted 列中。它永远不应该改变。
编辑条目时,应将当前日期添加到 edited 列中,并且每次编辑此条目时都会更新。

我的方法是在这两种情况下都定义数据类型date,并将标准值更改为CURDATE()。但是,只是将CURDATE() 作为字符串插入。

更新 这是一个示例查询:

CREATE TABLE `test`.`testtab` 
  ( 
     `id`             INT NOT NULL auto_increment, 
     `some column`    VARCHAR(100) NULL, 
     `another column` VARCHAR(100) NULL, 
     `inserted`       VARCHAR(100) NULL DEFAULT 'CURDATE()', 
     `edited`         VARCHAR(100) NULL DEFAULT 'CURDATE()', 
     PRIMARY KEY (`id`) 
  ) 
engine = innodb; 

不过,我不确定数据类型。

【问题讨论】:

  • 您的查询是什么?
  • inserted的类型是什么?
  • 喂?!?允许将文本/字符串“CURDATE()”插入到日期数据类型列中吗?这似乎不太可能,除非你的数据库真的很紧张。我能想到的就是从您的声明中删除 curdate() 周围的抽动。并验证插入和编辑都是“日期”数据类型。
  • 添加表的create查询。
  • @MuhammadMuazzam:请看我的更新。

标签: mysql sql


【解决方案1】:

根据您的需要,这将适合您:

CREATE TABLE `test`.`testtab` 
  ( 
     `id`             INT NOT NULL auto_increment, 
     `some column`    VARCHAR(100) NULL, 
     `another column` VARCHAR(100) NULL, 
     `inserted`       DATETIME DEFAULT   CURRENT_TIMESTAMP, 
     `edited`         DATETIME ON UPDATE CURRENT_TIMESTAMP, 
     PRIMARY KEY (`id`) 
  ) 
engine = innodb; 

然后在处理时只提取日期部分:

DATE_FORMAT(datetime, '%Y-%m-%d')

您可以使用触发器作为解决方法,将日期时间字段设置为 NOW() 以进行新插入:

CREATE TRIGGER `triggername` BEFORE INSERT ON  `tablename` 
FOR EACH ROW 
SET NEW.datetimefield = NOW()

它也应该适用于更新

【讨论】:

  • 有没有机会只存储日期而不存储时间?
  • DEFAULT 子句指定列的默认值。除了一个例外,默认值必须是一个常量;它不能是函数或表达式。例如,这意味着您不能将日期列的默认值设置为 NOW() 或 CURRENT_DATE 等函数的值。例外是您可以将 CURRENT_TIMESTAMP 指定为 TIMESTAMP 列的默认值
【解决方案2】:

尝试如下修改您的架构

`inserted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`edited` timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

希望这对您有所帮助。

【讨论】:

  • 有没有机会只显示日期而不显示时间?
  • 抓取时,可以将时间修剪为date(inserted)date(edited)
  • 使用DATE 字段而不是TIMESTAMP
  • @JuanCarlosOropeza:这样做,我得到了这个错误:Invalid default value for 'inserted'
【解决方案3】:

不幸的是,您不能将 MySQL DATE 字段默认为 curdate()。 mysql 提供以下选项:

  1. 从 MySQL 5.6.5 开始,您可以将 DATETIME 类型与动态默认值一起使用。例如已插入 DATETIME DEFAULT CURRENT_TIMESTAMP

  2. 在 5.6.5 之前的 TIMESTAMP(每个表只能退出一次自动更新)将在修改字段时更新字段。

参考: http://dev.mysql.com/doc/refman/5.7/en/timestamp-initialization.html

【讨论】:

    【解决方案4】:

    1) 我们需要查看您当前的查询,了解您如何插入新行。

    2) 插入行后,您可以在 phpmyadmin 中将列 edited 更改为“on update CURRENT TIMESTAMP”。为此,请转到您的表格,单击表格上方的“结构”选项卡,找到“已编辑”列,然后单击该列上的“更改”。然后,在“属性”设置下,您应该可以选择“更新当前时间戳”。然后保存更改并进行测试。

    【讨论】:

      猜你喜欢
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 2016-03-28
      相关资源
      最近更新 更多