質問するログイン新規登録

Q&A

解決済

3回答

250閲覧

DBのテーブル設計における、create_atとupdate_at の扱いについて

phpphp

総合スコア1

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2026/06/01 09:03

0

0

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

guest

回答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

hiroki-o

総合スコア1840

phpphp

2026/06/02 00:10

サンプルまで作成いただきありがとうございます。  ・MariaDBのバージョンは11.8  ・create_at、update_atの型はDATETIME型 先輩には従ったのですが、正しかったのか疑問が生じて質問させていただきました。 どちらでもそこまで変わりはなさそうなので、従います。
guest

0

どっちでもいいと思いますが、明確な理由がないなら先輩の指示通りにした方がいいと思います
失礼だし、反抗的です

投稿2026/06/01 13:10

u2025

総合スコア281

phpphp

2026/06/02 00:01

回答ありがとうございます。 指示通りにしたのですが、ちょっと疑問な部分もあったので質問していましました。
guest

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
yambejp

総合スコア118469

phpphp

2026/06/02 00:02

回答ありがとうございます。 ベストアンサーは別の方を選ばせていただきましたが、こちらの回答も非常に参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.25%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問