92

タイプのテーブルに列があり、デフォルトが CURRENT_TIMESTAMP の場合、同じ行のの列TIMESTAMPの値を更新すると、この列は現在のタイムスタンプに更新されますか? そうではないようですが、これが起こるべきかどうかはわかりません。 これが何を意味するのか理解できません ( MySQL のドキュメントから):

列が自動更新されている場合、行内の他の列の値が現在の値から変更されると、現在のタイムスタンプに自動的に更新されます。他のすべての列が現在の値に設定されている場合、列は変更されません。他の列が変更されたときに列が更新されないようにするには、明示的に現在の値に設定します。他の列が変更されていない場合でも列を更新するには、それが持つべき値に明示的に設定します] 2

4

5 に答える 5

155

コマンドを与えるSHOW CREATE TABLE whatever

次に、テーブル定義を見てください。

多分こんなセリフがある

logtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

初期化。 タイムスタンプが明示的に設定されていない場合は、現在の時刻が使用DEFAULT CURRENT_TIMESTAMPされることを意味します。INSERT同様にON UPDATE CURRENT_TIMESTAMP、明示的なタイムスタンプなしで更新すると、現在のタイムスタンプ値が更新されることを意味します。

テーブルを作成するときに、このデフォルトの動作を制御できます。

または、最初にタイムスタンプ列が正しく作成されなかった場合は、変更できます。

ALTER TABLE whatevertable
     CHANGE whatevercolumn 
            whatevercolumn TIMESTAMP NOT NULL
                           DEFAULT CURRENT_TIMESTAMP 
                           ON UPDATE CURRENT_TIMESTAMP;

これにより、テーブルに対する INSERT 操作と UPDATE 操作の両方で、タイムスタンプ列が自動的に更新されます。タイムスタンプを変更せずに更新したい場合whatevertable、つまり、

他の列が変更されたときに列が更新されないようにするには

次に、この種の更新を発行する必要があります。

UPDATE whatevertable
   SET something = 'newvalue',
       whatevercolumn = whatevercolumn
 WHERE someindex = 'indexvalue'

これは、TIMESTAMPおよびDATETIME列で機能します。(MySQL バージョン 5.6.5 より前では、TIMESTAMPs でのみ機能しました) s を使用するTIMESTAMPと、タイム ゾーンが考慮されます。正しく構成されたサーバー マシンでは、これらの値は常に UTC で保存され、取得時に現地時間に変換されます。

于 2013-09-23T15:14:17.717 に答える
15

このようにタイムスタンプ列を定義する必要があると思います

テーブル t1 の作成
(
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

こちらをご覧ください

于 2013-09-23T15:13:03.427 に答える
6

自動更新列は、行内の他の列の値が現在の値から変更されると、現在のタイムスタンプに自動的に更新されます。他のすべての列が現在の値に設定されている場合、自動更新された列は変更されません。

それを説明するために、行が 1 つしかない場合を考えてみましょう。

-------------------------------
| price | updated_at          |
-------------------------------
|  2    | 2018-02-26 16:16:17 |
-------------------------------

ここで、次の更新列を実行すると:

 update my_table
 set price = 2

価格の値は実際には変更されていないため (すでに 2 だった)、updated_at の値は変更されません。

ただし、2 以外の価格値を持つ別の行がある場合、その行 (価格 <> 3) の updated_at 値は CURRENT_TIMESTAMP に更新されます。

于 2018-02-27T14:29:21.250 に答える