2013-09-23 9 views
38

TIMESTAMPのテーブルに列があり、既定値がCURRENT_TIMESTAMPの場合、値を更新すると、この列は現在のタイムスタンプに更新されます 他の列は同じ行にありますか?
これは起こるべきことがあるかどうかはわかりませんが、そうは思われません。
私はこれが何を意味するか(from MySQL documentation)を理解できない。タイムスタンプ(自動)はいつ更新されますか?

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

+1

なぜ、あなたは 'test'テーブルを作成してサンプルデータを更新してこれを試していませんか?ところで、updateの 'timestamp'型の列は更新されません。 これはカラム定義 'ON UPDATE CURRENT_TIMESTAMP'に追加されていない場合 –

答えて

57

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またはDATE列で動作します。列がTIMESTAMPであるため、タイムゾーンが考慮されます。正しく構成されたサーバーマシンでは、これらの値は常にUTCで保存され、取得時にローカル時間に変換されます。新しい人々のために、これは混乱であるため、UPDATE CURRENT_TIMESTAMPを見つけるために追加

+0

Ah!実際には 'DEFAULT CURRENT_TIMESTAMP'しかありません。 'UPDATE'の部分ではありません – Jim

+0

' DEFAULT CURRENT_TIMESTAMPは、明示的なタイムスタンプ設定のないINSERTが現在の時刻を使用して実行されることを意味します.'私の場合、 'DEFAULT CURRENT_TIMESTAMP' *がありますが、' UPDATE'には*列は*更新されていません。だから私はあなたがこの文章で何を意味するのか明確ではない – Jim

+0

明確にしようとした私の編集を参照してください。 INSERTとUPDATEのデフォルト動作は個別に制御されます。 –

8

私はあなたがこの

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

参照hereのようなタイムスタンプ列を定義するために持っていると思います

+1

マインには' DEFAULT CURRENT_TIMESTAMP'があります – Jim

0

ほとんどの人はそれのようにphpmyadminのか何かを使用します。

デフォルト値あなたはCURRENT_TIMESTAMPが

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

1

がデータベースにトリガーを追加]を選択:

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 ; 

パスワードは更新される時間を変更しましたパスワード列が変更されたとき。行の他の列の値を現在の値から変更されたとき

0

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

update my_table 
set price = 2 

それがあるため、updated_atの値を変更しません:あなたは、次の更新列を実行する場合、今

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

:あなたは一列のみを持っている想像してみましょう、それを説明するために

価格の値は実際には変更されていませんでした(既に2でした)。

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

関連する問題