MySQL更新错误的列

时间:2016-10-03 13:11:45

标签: mysql sql datetime

我的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服务器是否有可能损坏?这是一个非常数据密集的系统,我们有许多表,包含大量数据,例如,有大量插入,更新过程的2000万到3000万行。

还有可能在几天内自动删除数据以便mysql可伸缩性吗? 请就此提出您的意见/建议。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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