1

我有一个带有一DATETIME列的大表,出于索引原因,我想添加一个仅包含 DATE 类型的列。似乎 MySQL 无法通过以下表达式使用索引,GROUP BY DATE(datetime)因此我想添加具有第二个索引的另一列。

对于更新,我使用这个简单的语句:

UPDATE table SET datecol = DATE(datetimecol)

现在发生了一个奇怪的行为:datecol-column包含正确的值。但datetimecolumn变化也是如此:对当前的timestamp. 这是此列的默认值。

我现在已经使用数据库和 MySQL 工作了很多年,但我无法解释这种行为。

当前版本是MySQL 5.1.66-0.

您对此有什么建议或解释吗?

4

1 回答 1

1

datetimecol的不是 type DATETIME,而是 type TIMESTAMP(默认情况下)具有在修改记录时自动更新到当前时间的ON UPDATE CURRENT_TIMESTAMP属性。

要抑制第一TIMESTAMP列的自动属性,请执行以下任一操作:

  • DEFAULT使用指定常量默认值的子句定义列。

  • 指定NULL属性。这也会导致列允许NULL值,这意味着您不能通过将列设置为来分配当前时间戳NULL。分配NULL将列设置为NULL

所以:

ALTER TABLE my_table
  MODIFY datetimecol TIMESTAMP DEFAULT CURRENT_TIMESTAMP;

要在不更改 中的值的情况下更新一次记录datetimecol,您应该将它们显式设置为其现有值:

UPDATE my_table SET
  datetimecol = datetimecol,
  datecol     = DATE(datetimecol);
于 2013-01-20T19:19:29.510 回答