MariaDB vs MySQL: DATETIME 型のデフォルト値徹底比較

2024-04-02

MariaDB の DATETIME 型のデフォルト値は、カラムが NOT NULL 属性で定義されているかどうかによって異なります。

  • NOT NULL 属性が設定されていない場合: デフォルト値は NULL です。つまり、値が設定されていない場合は何も格納されません。
  • NOT NULL 属性が設定されている場合: デフォルト値は 0000-00-00 00:00:00 になります。これは、西暦0年1月1日午前0時0分0秒を表します。

詳細

  • NULL 許容の場合:
CREATE TABLE my_table (
  datetime_col DATETIME
);

この場合、datetime_col カラムは NULL 値を許容します。つまり、レコード挿入時に値を指定しない場合は、NULL が格納されます。

  • NOT NULL の場合:
CREATE TABLE my_table (
  datetime_col DATETIME NOT NULL
);

その他の注意点

  • DEFAULT キーワードを使用して、デフォルト値を明示的に指定することもできます。
CREATE TABLE my_table (
  datetime_col DATETIME DEFAULT '2024-03-23 06:11:00'
);

この場合、datetime_col カラムのデフォルト値は 2024-03-23 06:11:00 になります。

  • MariaDB 10.3 以降では、CURRENT_TIMESTAMP をデフォルト値として指定することもできます。
CREATE TABLE my_table (
  datetime_col DATETIME DEFAULT CURRENT_TIMESTAMP
);

この場合、datetime_col カラムには、レコード挿入時の現在時刻が格納されます。




-- テーブル作成
CREATE TABLE my_table (
  id INT AUTO_INCREMENT PRIMARY KEY,
  datetime_col_nullable DATETIME,
  datetime_col_not_null DATETIME NOT NULL
);

-- デフォルト値の確認
SELECT id, datetime_col_nullable, datetime_col_not_null FROM my_table;

-- 値挿入 (NULL 許容)
INSERT INTO my_table (datetime_col_nullable) VALUES (NULL);

-- 値挿入 (NULL 非許容)
INSERT INTO my_table (datetime_col_not_null) VALUES (NULL);

-- 値挿入 (デフォルト値)
INSERT INTO my_table (datetime_col_nullable, datetime_col_not_null) VALUES (NULL, NULL);

-- 結果確認
SELECT id, datetime_col_nullable, datetime_col_not_null FROM my_table;

実行結果

| id | datetime_col_nullable | datetime_col_not_null |
|---|---|---|
| 1 | NULL                  | 0000-00-00 00:00:00 |
| 2 | NULL                  | 0000-00-00 00:00:00 |
| 3 | NULL                  | 0000-00-00 00:00:00 |

解説

  • 最初の INSERT ステートメントは、datetime_col_nullable カラムに NULL 値を挿入します。これはデフォルト値なので、明示的に指定する必要はありません。
  • 2番目の INSERT ステートメントは、datetime_col_not_null カラムに NULL 値を挿入しようとします。しかし、このカラムは NOT NULL 属性で定義されているため、エラーが発生します。
  • 3番目の INSERT ステートメントは、両方のカラムに NULL 値を挿入します。datetime_col_nullable カラムは NULL 値を許容するため、デフォルト値である NULL が格納されます。一方、datetime_col_not_null カラムは NULL 値を許容しないため、デフォルト値である 0000-00-00 00:00:00 が格納されます。



DATETIME 型のデフォルト値を設定する他の方法

CURRENT_TIMESTAMP キーワードを使用して、レコード挿入時の現在時刻をデフォルト値として設定できます。

CREATE TABLE my_table (
  datetime_col DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE my_table (
  datetime_col DATETIME DEFAULT '2024-03-23 06:11:00'
);

ビューを使用して、デフォルト値を動的に設定できます。

CREATE VIEW my_view AS
SELECT id,
       CURRENT_TIMESTAMP AS datetime_col
FROM my_table;

INSERT INTO my_table (id)
SELECT 1
FROM my_view;

トリガーを使用して、レコード挿入時にデフォルト値を設定できます。

DELIMITER //

CREATE TRIGGER my_trigger BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN
  IF NEW.datetime_col IS NULL THEN
    SET NEW.datetime_col = CURRENT_TIMESTAMP;
  END IF;
END;
//

DELIMITER ;

アプリケーション側でデフォルト値を設定することもできます。

import mysql.connector

connection = mysql.connector.connect(
  host="localhost",
  user="root",
  password="password",
  database="my_database"
)

cursor = connection.cursor()

cursor.execute("""
INSERT INTO my_table (id, datetime_col)
VALUES (1, '2024-03-23 06:11:00')
""")

connection.commit()
cursor.close()
connection.close()
  • 常に現在時刻をデフォルト値として設定したい場合は、CURRENT_TIMESTAMP を使用するのが最も簡単です。
  • 特定の値をデフォルト値として設定したい場合は、DEFAULT キーワードを使用するのが一般的です。
  • より複雑なデフォルト値を設定したい場合は、ビューやトリガーを使用することができます。

mysql mariadb


Entity Framework を使用した MySQL データベースのチュートリアル

必要なもの.NET Framework 4.5 以降Visual Studio 2013 以降MySQL 5.6 以降Entity Framework 6 以降MySQL Connector/Net 8.0 以降手順NuGet パッケージのインストール Visual Studio ソリューションに以下の NuGet パッケージをインストールします。...


【コード付き解説】MySQLでJOINとSET句を使って別のテーブルの値を列に更新する方法

MySQLで、あるテーブルの列を別のテーブルの値を使って更新する方法について解説します。方法はいくつかありますが、ここでは代表的な2つの方法を紹介します。JOINとSET句を使う方法この方法は、JOINを使って2つのテーブルを結合し、SET句を使って更新したい列に別のテーブルの値を代入する方法です。...


【保存版】MariaDBで複数行挿入を使いこなす方法:詳細解説とサンプルコード

複数サブクエリを用いる INSERT 文の構文例次の例では、customers テーブルに 2 つのサブクエリからデータを挿入します。この例では、最初のサブクエリは users テーブルから first_name、email、city 列を選択し、customers テーブルに挿入します。2 番目のサブクエリは users テーブルから last_name 列のみを選択し、email 列は NULL に設定し、city 列は 'New York' に設定して customers テーブルに挿入します。...


タイムトラベルを超えた情報共有!MySQL/MariaDBで実現する戦国武将のタイムゾーンを超えた連携

戦国時代は、まさにドラマのような激動の時代! 武将たちの華麗な活躍や、織田信長、豊臣秀吉、徳川家康といった英雄たちの知略に満ちた戦いが繰り広げられました。 そんな戦国時代を、3つの意外な豆知識と共に、わかりやすくまとめてみました!戦国時代の意外な日常...


情報スキーマテーブル、システムビュー、クライアントツールを活用:MySQL/MariaDBのインデックス列を詳細にリスト

インデックス列は、クエリのパフォーマンスを向上させるために選択する列です。適切なインデックス列を選択することで、データベースがデータをより早く検索できるようになり、クエリの実行時間が短縮されます。インデックス列を選択する際のヒント頻繁に使用する列を選択する: WHERE 句や ORDER BY 句で使用される列をインデックス化すると、効果的です。...


SQL SQL SQL SQL Amazon で見る



MySQL DATETIMEカラムのデフォルト値設定:CURRENT_TIMESTAMP vs 定数

MySQLのDATETIMEカラムにデフォルト値を設定するには、以下の2つの方法があります。定数をデフォルト値として指定するCURRENT_TIMESTAMPまたはCURRENT_DATE関数を使用する上記のように、DEFAULT句で定数を指定することで、デフォルト値を設定できます。


MariaDB CURRENT_TIMESTAMP デフォルト値を使いこなして、タイムスタンプ管理をマスターしよう

MariaDB の CURRENT_TIMESTAMP は、現在の日時を返す関数です。デフォルト値は、レコードが作成されたときと更新されたときの両方で、現在のタイムスタンプになります。デフォルト値の動作新しいレコードを作成すると、CURRENT_TIMESTAMP を使用して TIMESTAMP または DATETIME 型の列に自動的に値が挿入されます。