2016-10-03 48 views
1

我在我的mysql中有一個奇怪的問題。該表包含大約2000萬行。 表的結構是:MySQL正在更新錯誤的列

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) 

日期,E,G的整數版本,start_date_int和end_date_int列是使用TO_DAYS()函數存儲的時間爲一個整數。 MySQL TO_DAYS()返回給定日期和年份0之間的天數。同樣,start_time_int和end_time_int列存儲datetime值的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' 

更新statment之前工作的罰款。然而,今天它似乎只是更新'2016-10-03'的行(我的觀察是基於count的),奇怪的是它正在更新start_datetime列和發佈查詢的日期時間,儘管我沒有把這個列在更新聲明!

有沒有可能導致mysql服務器損壞?這是一個非常數據密集的系統,我們有很多數據表,包括大量的數據,例如20-30萬行插入,更新過程。

還有什麼可能數據可能會自動刪除幾天自動有時爲MySQL的可擴展性? 請對此提出您的意見/建議。

+3

這很可能是你在解釋發生的事情時犯了錯誤。很難想象MySQL如何被如此手術破壞,以至於允許操作發生(沒有錯誤),而是更新錯誤的列。我曾經有一次與SQL Server有類似的問題,這是一個列被插入到表中的結果,但是代碼沒有被重新編譯。 –

+0

感謝您的評論。我正在使用navicat for mysql工具直接編寫update語句。我多次重新發布更新聲明,並將其展示給其他兩位開發人員。但仍然是更新start_datetime和end_datetiem列:( – user6725114

回答

1

我認爲你的一些列是auto-computed,你可以檢查更新後也許有這個表trigger,它可以根據start_datetime_int/end_datetime_int更新值填補start_datetime/end_datetime。 我希望這可以幫助...

+0

我有一個插入觸發器,但不是更新插入觸發器填充start_datetime_int值基於新的start_datetime值插入一個新行時今天我們要重新啓動讓我們看看它是否有幫助 – user6725114

0

經過進一步調查後,我發現在mysql的navicat表設計中,有人在start_datetime和end_datetime列中選中了一個名爲「on update current_timestamp」選項的複選框,它是造成這個問題。我的錯。感謝您的反饋意見。

Navicat for mysql在默認情況下啓用了此選項。因此,當表格具有日期時間列時,使用Navicat創建表格時應該小心。

+1

這是一個例子,說明爲什麼當你問一個問題時,你應該發佈'SHOW CREATE TABLE session_table'的輸出,而不是你認爲的表定義應該是什麼。 –