web-dev-qa-db-ja.com

タイムスタンプ(自動)はいつ更新されますか?

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

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

63
Jim

コマンドSHOW CREATE TABLE whateverを与えます

次に table definition を見てください。

おそらくこのような行があります

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列またはDATE列では機能しません。列はTIMESTAMPsであるため、タイムゾーンが考慮されます。正しく構成されたサーバーマシンでは、これらの値は常にUTCに格納され、取得時に現地時間に変換されます。

106
O. Jones

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

 CREATE TABLE t1 
(
 ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP UPDATE CURRENT_TIMESTAMP
); 

こちら をご覧ください

12
juergen d

データベースにトリガーを追加します。

DELIMITER //
CREATE TRIGGER update_user_password 
  BEFORE UPDATE ON users
  FOR EACH ROW
    BEGIN
      IF OLD.password <> NEW.password THEN
        SET NEW.password_changed_on = NOW();
      END IF;
    END //
DELIMITER ;

パスワード変更時刻は、パスワード列が変更されたときにのみ更新されます。

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

それを説明するために、1行しかないことを想像してみましょう。

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

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

 update my_table
 set price = 2

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

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

1
Alexander

新しい人にとってこれは混乱であるため、UPDATE CURRENT_TIMESTAMPの場所を追加します。

ほとんどの人はphpmyadminなどを使用します。

選択したデフォルト値CURRENT_TIMESTAMP

属性(異なるドロップダウン)UPDATE CURRENT_TIMESTAMPを選択します

0
BrinkDaDrink