2016-10-03 2 views
1

私のmysqlに奇妙な問題があります。この表には約2,000万行が含まれています。 テーブルの構造は以下の通りである:。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' 

更新なステートメントは、前にうまく働きました。しかし、今日は'2016-10-03 'の行を更新するだけです(私の所見はカウントに基づいています)。不思議なことに、start_datetime列をdatetimeで更新していますが、更新文で!

mysqlサーバが壊れている可能性はありますか?非常にデータ集約型のシステムで、たくさんのデータを持つテーブルがたくさんあります。たとえば、多くの挿入、更新プロセスを伴う2,000万〜3千万の行があります。

mysqlスケーラビリティのためにデータが数日間自動的に削除される可能性もありますか? ご意見/ご提案をお願いします。

+3

あなたは何が起こったのかを間違って解釈した可能性が高いです。 MySQLがどのようにして外科的に壊れているのかを想像するのは難しいです。誤操作を起こすことなく、間違った列を更新することができます。私はかつて列にテーブルを挿入した結果、SQL Serverで同様の問題が発生しましたが、コードは再コンパイルされませんでした。 –

+0

ご意見ありがとうございます。私はmysqlツール用のnavicatを使って更新ステートメントを直接書いています。私は更新ステートメントを何度か再cehckedまた、2つの他の開発者にそれを示した。しかし、それでもstart_datetimeカラムとend_datetiemカラムを更新しています:( – user6725114

答えて

1

私はあなたの列の一部がauto-computedがあるのtriggerは多分更新した後に、このテーブルの上にあり、それはstart_datetime_int/end_datetime_intの更新された値に応じてstart_datetime/end_datetimeを埋める可能性がある場合、あなたは確認することができると思います。 私はこれが助けてくれることを願っています...

+0

私は挿入のためのトリガを持っていますが、更新はしません。 – user6725114

0

さらに調査したところ、mysql用のnavicatのテーブルデザインでは、誰かがstart_datetimeカラムとend_datetimeカラムの "on update current_timestamp"オプションをチェックしました。この問題が発生します。私の悪い。ご意見をいただきありがとうございます。

Navicat for mysqlには、このオプションがデフォルトで有効になっています。したがって、テーブルにdatetimeカラムがある場合、Navicatを使用してテーブルを作成するときは常に注意が必要です。

+1

これは、あなたが*考えると思うものではなく、質問をするときに 'SHOW CREATE TABLE session_table'の出力を掲示するべき理由の例です。 –

関連する問題