web-dev-qa-db-ja.com

作成時および更新時のMySQL CURRENT_TIMESTAMP

次のような2つのTIMESTAMPフィールドを持つテーブルを定義します。

CREATE TABLE `msgs` (
    `id` INT PRIMARY KEY AUTO_INCREMENT,
    `msg` VARCHAR(256),
    `ts_create` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    `ts_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)

エラーを回避してこれを行う方法:

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

ポイントは、テーブルスキーマでts_createts_updateの望ましい動作を維持することです。

63
kuba

これはmySQLの制限です。cannotには、CURRENT_TIMESTAMPを参照するデフォルトのTIMESTAMP列が2つあります。それを行う唯一の方法は、ts_createにDATETIME型を使用することであり、残念ながらNOW()のデフォルト値を持つことはできません。ただし、独自のトリガーを実行して、それを実現することができます。

55
Clement P

これは古い投稿だと思いますが、実際にはmysqlは最近のエディションで2つのTIMESTAMPをサポートしていると思います。

14
avinash v p

古いバージョンのMySqlを使用しています。 mysqlを5.6.5+に更新すると動作します。

5

私はそれが以下の手法を使用することによって可能だと思う

`ts_create` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`ts_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
2
iKing

テーブルに同じデフォルト値のCURRENT_TIMESTAMPを持つ2つのTIMESTAMP列を持つことはできません。このリンクを参照してください: http://www.mysqltutorial.org/mysql-timestamp.aspx

1
clemquinones

これを試すことができますts_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP、ts_update TIMESTAMP DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP

0
AJavaLover

Ts_createをdatetimeとして(したがって、名前を変更-> dt_create)、ts_updateだけをタイムスタンプとして使用したいのではないでしょうか。これにより、設定後に変更されないようになります。

私の理解では、datetimeは手動で制御される値用であり、タイムスタンプはMySQLがそれを維持するという点で少し「特別」です。したがって、この場合、date_timeはts_createの適切な選択です。

0
Brian

Ts_updateにDEFAULT CURRENT_TIMESTAMPを設定する必要はありません。空の場合は更新されないため、「最終更新」はts_createです。

0
Nanne

これは、旧バージョンのMysqlの小さな制限であり、実際にはバージョン5.6以降では複数のタイムスタンプが機能します...

0