【问题标题】:MySQL Updating wrong columnMySQL更新错误的列
【发布时间】:2016-10-03 13:11:44
【问题描述】:

我的 mysql 有一个奇怪的问题。该表包含大约 2000 万行。 表结构为:

    create table session_table (id int, start_datetime
    datetime,start_date_int int, start_time_int, end_datetime datetime, 
    end_date_int int, end_datetime_int int)

日期的整数版本,例如 start_date_int 和 end_date_int 列用于使用 to_days() 函数将日期存储为整数。 MySQL TO_DAYS() 返回给定日期和年份 0 之间的天数。类似地 start_time_int 和 end_time_int 列存储日期时间值的 unix_timestamp。

现在看下面的更新声明:

    update session_table
    SET
      start_date_int=to_days(start_datetime),
      start_datetime_int=UNIX_TIMESTAMP((start_datetime),
      end_date_int=to_days(end_datetime),
      end_datetime_int=UNIX_TIMESTAMP(end_datetime)
    where start_datetime >= '2016-07-01 00:00:00'

更新语句之前运行良好。但是今天它似乎只更新了“2016-10-03”的行(我的观察是基于计数),奇怪的是它正在用我发出查询的日期时间更新 start_datetime 列,虽然我没有放这个列在更新声明中!

mysql服务器是否有损坏的可能性?这是一个非常数据密集型的系统,我们有许多包含大量数据的表,例如,20-3000 万行包含大量插入、更新过程。

为了 mysql 的可扩展性,是否有可能会自动删除几天的数据? 请就此提出您的意见/建议。

【问题讨论】:

  • 很有可能您在解释所发生的事情时犯了错误。很难想象 MySQL 怎么会被如此严重地破坏,以至于允许操作发生(没有错误)但更新错误的列。我曾经在使用 SQL Server 时确实遇到过类似的问题,这是由于在表中插入了列,但代码没有被重新编译。
  • 感谢您的评论。我正在使用navicat for mysql 工具直接编写更新语句。我多次重新检查更新声明,并将其展示给另外两个开发人员。但它仍然在更新 start_datetime 和 end_datetiem 列:(

标签: mysql sql datetime


【解决方案1】:

我认为您的某些列是auto-computed,您可以在更新后检查此表上是否有trigger,它可能会根据start_datetime_int/end_datetime_int 的更新值填充start_datetime/end_datetime。 我希望这会有所帮助...

【讨论】:

  • 我有一个插入触发器,但没有更新触发器。插入新行时,插入触发器根据新的 start_datetime 值填充 start_datetime_int 值。今天我们要重启服务器。让我们看看它是否有帮助。
【解决方案2】:

经过进一步调查,我发现在navicat for mysql的表设计中,有人为start_datetime和end_datetime列勾选了一个名为“on update current_timestamp”选项的复选框,这导致了这个问题。我的错。感谢您的反馈意见。

Navicat for mysql 默认启用此选项。因此,当表具有日期时间列时,使用 Navicat 创建表时应始终小心。

【讨论】:

  • 这是一个示例,说明为什么您应该在提问时发布 SHOW CREATE TABLE session_table 的输出,而不是您认为表定义应该是什么。
猜你喜欢
  • 1970-01-01
  • 2013-03-12
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 2017-07-21
  • 2015-04-10
相关资源
最近更新 更多