MySQLでTIMESTAMP型(DEFAULT CURRENT_TIMESTAMP)のカラムに空の値を挿入するとどうなる?
TIMESTAMP型カラムに値を指定せずにINSERTすると現在日時が記録される
MySQLでは、timestamp default current_timestamp のようにデフォルト値として CURRENT_TIMESTAMP を設定したTIMESTAMP型カラムに対して、INSERT文で値を何も指定しなかった場合、自動的に現在の日時が挿入されます。
実際に動作を確認してみましょう。まず、以下のようにテーブルを作成します。
mysql> create table DemoTable
-> (
-> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserLoginDate timestamp default current_timestamp
-> );
Query OK, 0 rows affected (0.61 sec)
次に、INSERTコマンドを使ってレコードを挿入します。ここでのポイントは、VALUES句を空にしてもエラーにならず、デフォルト値が適用される点です。
mysql> insert into DemoTable values();
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values();
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values();
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable(UserId) values(null);
Query OK, 1 row affected (0.13 sec)
SELECT文ですべてのレコードを表示して確認します。
mysql> select *from DemoTable;
実行結果は以下のとおりです。
+--------+---------------------+
| UserId | UserLoginDate |
+--------+---------------------+
| 1 | 2019-11-03 12:55:44 |
| 2 | 2019-11-03 12:55:45 |
| 3 | 2019-11-03 12:55:46 |
| 4 | 2019-11-03 12:56:06 |
+--------+---------------------+
4 rows in set (0.00 sec)
結果のポイント
- VALUES句を空にして挿入したレコード(UserId 1〜3)にも、実行時点の日時が自動的に記録されています。
- AUTO_INCREMENTの主キーに対して明示的にNULLを指定した4行目の場合も、UserLoginDateにはデフォルトの現在日時がセットされます。
このように、CURRENT_TIMESTAMP をデフォルト値に設定しておけば、ユーザーのログイン日時やレコードの作成日時などを、アプリケーション側で明示的に渡すことなく自動管理できるのが大きなメリットです。
-
JavaでMySQLテーブルに1つのカラムのみを挿入する方法
JavaとMySQLを連携させる際、テーブルの一部のカラムだけにデータを挿入したいケースはよくあります。その場合は、JDBCのINSERT INTOステートメントを使用します。挿入対象のカラム名を明示的に指定することで、他のカラムには影響を与えずに1つのカラムのみへ値を登録できます。この記事では、実際にテーブルを作成し、Javaのコードから「Name」という1つのカラムだけにデータを挿入する手順を解説します。1. 挿入先のテーブルを作成するまず、MySQLで以下のようにテーブルを作成しておきましょう。ここでは、varchar型の「Name」カラムを1つだけ持つシンプルなテーブルを用意します。m
-
MySQLでJSON型カラムにデフォルト値を設定する方法
MySQLでは、JSON型のカラムにもデフォルト値を設定できます。その場合は、DEFAULT制約を使用します。基本的な構文は以下の通りです。ALTER TABLE テーブル名 MODIFY COLUMN カラム名 JSON NOT NULL DEFAULT ( JSON_OBJECT() );サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。ここでは demo24 というテーブルを作成します。mysql> create table demo24 -> ( -> employee_information text -> ) ->; Query OK,