【发布时间】: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 列:(