phpが開発言語、MariaDBを使って、
簡単な勤怠システム(打刻のみ記録するシステム)の構築を考えています。
打刻情報のテーブルには、打刻ユーザや、開始時刻、終了時刻を記録します。
また、レコードの作成日時(create_at)と更新日時(update_at)のフィールドを追加する予定でした。
この作成日時(create_at)と更新日時(update_at)についての疑問です。
create_atは「DEFAULT CURRENT_TIMESTAMP」をつけます。
update_atを「DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP」にしようと思ったところ「ON UPDATE CURRENT_TIMESTAMP」のみでよいのでは?と言われました(会社先輩)。
どちらがよいでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
回答3件
0
ベストアンサー
この質問は、以下の2点を提示してほしかったです。
- MariaDBのバージョン(今どき5.5以前は使わないかもしれませんが...)
- create_at、update_atの型は、TIMESTAMPかDATETIMEか
手元にMariaDBの環境が無いので、MySQL 8.4.9で確認しました。
MariaDBはMySQLの派生なので参考になると思います。
サンプルSQL (大文字・小文字が混じっているのは見逃してください)
sql
1CREATE TABLE user1 ( 2name VARCHAR(100), 3created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 4updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 5); 6 7CREATE TABLE user2 ( 8name VARCHAR(100), 9created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 10updated_at TIMESTAMP DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP 11); 12 13CREATE TABLE user3 ( 14name VARCHAR(100), 15created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 16updated_at TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 17); 18 19CREATE TABLE user4 ( 20name VARCHAR(100), 21created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 22updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 23); 24 25CREATE TABLE user5 ( 26name VARCHAR(100), 27created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 28updated_at DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP 29); 30 31CREATE TABLE user6 ( 32name VARCHAR(100), 33created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 34updated_at DATETIME ON UPDATE CURRENT_TIMESTAMP 35); 36 37insert into user1(name) values('test_user'); 38insert into user2(name) values('test_user'); 39insert into user3(name) values('test_user'); 40insert into user4(name) values('test_user'); 41insert into user5(name) values('test_user'); 42insert into user6(name) values('test_user'); 43 44update user1 set name='test_user1'; 45update user2 set name='test_user1'; 46update user3 set name='test_user1'; 47update user4 set name='test_user1'; 48update user5 set name='test_user1'; 49update user6 set name='test_user1';
上記SQLで言うと、質問者さんはuser1、先輩はuser3という意見だと思います。
初回insert時にcreated_atと同じ日時が設定されるか、NULLが設定されるかの違いです。
update以降は、updated_atに更新日時が設定されます。
どちらでもいいので、先輩に従いましょう。
投稿2026/06/01 15:52
総合スコア1840
0
どっちでもいいと思いますが、明確な理由がないなら先輩の指示通りにした方がいいと思います
失礼だし、反抗的です
投稿2026/06/01 13:10
総合スコア281
0
update_atの型次第ですね。mysqlはもともとの1テーブルにtimestampを指定できるのは1カラムだけという制約があったはずです。
create_atにtimestampを利用するとupdate_atはdatetimeになるのでデフォルト値はNULLで問題なかったのですが、いまの複数カラムtimestampが利用できる環境で仮にupdate_atをデフォルト値にNULLを指定すると、更新時に最新日付が設定されません。ちょっと不親切ですね。
そう考えれば質問者さんの認識の「DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP」が必須です。
逆にupdate_atをdatetimeにしてデフォルト値をnullとしておけば、更新のないレコードを見分けやすいですね。(datetimeカラムは ON UPDATE CURRENT_TIMESTAMP属性でNULLも最新データに更新されます)
とはいえ、create_atとupdate_atの値が同値であれば更新がないレコードだとわかるので、どちらが有利ということはないと思います。チームの運用パターンによるでしょう。(つまり先輩がそうだといえばそれが答えです)
投稿2026/06/01 09:58
編集2026/06/01 10:01総合スコア118469
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
2026/06/02 00:10