我的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可伸缩性吗? 请就此提出您的意见/建议。
答案 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创建表时应始终小心。