1

列を持つ大きなテーブルがDATETIMEあり、インデックスの理由から、DATE 型だけを含む列を追加したいと考えています。MySQL は次の式でインデックスを使用できないようGROUP BY DATE(datetime)です。そのため、2 つ目のインデックスを持つ別の列を追加したいと考えています。

更新には、次の簡単なステートメントを使用します。

UPDATE table SET datecol = DATE(datetimecol)

ここで奇妙な動作が発生します: にdatecol-columnは正しい値が含まれています。しかし、datetimecolumn変更も同様です: 現在のtimestamp. これは、この列のデフォルト値です。

私はデータベースと MySQL で長年働いていますが、この動作を説明することはできません。

現在のバージョンはMySQL 5.1.66-0.

これについて何か提案や説明はありますか?

4

1 に答える 1

1

あなたdatetimecolはタイプではありませんが、 (デフォルトで)レコードが変更されたときに現在の時刻に自動的に更新される属性を持つDATETIMEタイプです。TIMESTAMPON UPDATE CURRENT_TIMESTAMP

TIMESTAMP最初の列の自動プロパティを抑制するには、次のいずれかを実行します。

  • DEFAULT定数のデフォルト値を指定する句を使用して列を定義します。

  • 属性を指定しNULLます。これにより、列にNULL値が許可されます。つまり、列を に設定して現在のタイムスタンプを割り当てることはできませんNULL。を割り当てるNULLと、列が に設定されNULLます。

したがって:

ALTER TABLE my_table
  MODIFY datetimecol TIMESTAMP DEFAULT CURRENT_TIMESTAMP;

の値を変更せずにレコードを一度だけ更新するにはdatetimecol、既存の値に明示的に設定する必要があります。

UPDATE my_table SET
  datetimecol = datetimecol,
  datecol     = DATE(datetimecol);
于 2013-01-20T19:19:29.510 に答える