mysqlタイムスタンプの使用

mysqlタイムスタンプの使用

序文:

タイムスタンプ フィールドは、MySQL でよく使用されます。たとえば、データ行が作成または変更された時刻を記録する必要がある場合、通常はタイムスタンプ フィールドを使用します。この記事では、主にタイムスタンプ フィールドの使用方法と関連パラメータを紹介します。この記事をお読みいただくことで、タイムスタンプについてより深く理解していただければ幸いです。

1. TIMESTAMPフィールドタイプの概要

タイムスタンプ フィールド タイプには、時間タイプのデータを保存できます。タイムスタンプが保存できる時間の範囲は、「1970-01-01 00:00:01.000000」から「2038-01-19 03:14:07.999999」です。タイムスタンプ フィールドは 4 バイトを占めます。 MySQL 5.7 では、timestamp で精度を指定できます。つまり、TIMESTAMP(fsp) の fsp で、小数秒の精度を表す 0 ~ 6 のオプションの値を指定できます。値 0 は小数部がないことを意味し、省略した場合、デフォルトの精度は 0 になります。

簡単なテストをしてみましょう:

# タイムスタンプは精度を指定できますmysql> CREATE TABLE `stu_tb` (
  -> `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自動増分主キー',
  -> `stu_id` int(11) NOT NULL COMMENT '学生番号',
  -> `stu_name` varchar(20) DEFAULT NULL COMMENT '学生名',
  -> `create_time` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成時間',
  -> `update_time` タイムスタンプ(2) NOT NULL DEFAULT CURRENT_TIMESTAMP(2) ON UPDATE CURRENT_TIMESTAMP(2) COMMENT '変更時刻',
  -> 主キー (`id`)
  -> ) ENGINE=InnoDB デフォルト文字セット=utf8;
クエリは正常、影響を受けた行は 0 行 (0.04 秒)
mysql> テーブル stu_tb\G の作成を表示します
************************** 1. 行 ****************************
    テーブル: stu_tb
テーブルの作成: CREATE TABLE `stu_tb` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自動増分主キー',
 `stu_id` int(11) NOT NULL COMMENT '学生ID',
 `stu_name` varchar(20) デフォルト NULL コメント '学生名',
 `create_time` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成時刻',
 `update_time` タイムスタンプ(2) NOT NULL DEFAULT CURRENT_TIMESTAMP(2) ON UPDATE CURRENT_TIMESTAMP(2) COMMENT '変更時刻',
 主キー (`id`)
) エンジン=InnoDB デフォルト文字セット=utf8
セット内の 1 行 (0.00 秒)
mysql> stu_tb (stu_id,stu_name) に値 (1001,'dfdfa') を挿入します。
クエリは正常、1 行が影響を受けました (0.01 秒)
mysql> stu_tb から * を選択します。
+----+--------+----------+------------------------+-------------------------+
| id | stu_id | stu_name | 作成時刻 | 更新時刻 |
+----+--------+----------+------------------------+-------------------------+
| 1 | 1001 | dfdfa | 2020-01-07 17:33:51 | 2020-01-07 17:33:51.63 |
+----+--------+----------+------------------------+-------------------------+
セット内の 1 行 (0.00 秒)

2. タイムスタンプに影響するパラメータ

タイムスタンプの表示に影響する主なパラメータは、explicit_defaults_for_timestamp と time_zone の 2 つです。以下では、これら 2 つのパラメータがタイムスタンプに与える影響について簡単に説明します。

expressly_defaults_for_timestamp パラメータは、MySQL サーバーがタイムスタンプ列のデフォルト値と NULL 値を処理する方法を決定します。この変数は、MySQL 5.6.6 以降で導入されました。グローバル レベルとセッション レベルに分かれており、動的に更新できます。デフォルト値は OFF です。このパラメータの詳細については、こちらの記事を参照してください。

デフォルトで、explicit_defaults_for_timestamp パラメータが OFF に設定されている場合、動作は次のようになります。

  • デフォルトでは、タイムスタンプ列に null 属性が明示的に指定されていない場合、列には自動的に not null 属性が追加されます (not null を明示的に指定していない他の種類の列では null 値が許可されます)。この列に null 値が挿入されると、列の値は自動的に現在のタイムスタンプ値に設定されます。
  • NULL 属性が指定されていないか、デフォルト値が指定されておらず、ON UPDATE 句が指定されていない場合、テーブルの最初のタイムスタンプ列。その後、列には DEFAULT CURRENT_TIMESTAMP 属性と ON UPDATE CURRENT_TIMESTAMP 属性が自動的に追加されます。
  • その他の TIMESTAMP 列では、NULL 属性と DEFAULT 属性が明示的に指定されていない場合、自動的に NOT NULL DEFAULT '0000-00-00 00:00:00' に設定されます。 (もちろん、これは SQL_MODE に関連しています。SQL_MODE に 'NO_ZERO_DATE' が含まれている場合、実際にはデフォルト値を '0000-00-00 00:00:00' に設定することはできません。)

expressly_defaults_for_timestamp パラメータが ON に設定されている場合、動作は次のようになります。

  • タイムスタンプ列に明示的な非 NULL 属性がない場合、列はデフォルトで NULL になることがあります。この場合、列に NULL 値が挿入されると、現在のタイムスタンプの代わりに NULL が直接記録されます。
  • DEFAULT CURRENT_TIMESTAMP 属性と ON UPDATE CURRENT_TIMESTAMP 属性は、テーブルの最初のタイムスタンプ列に自動的に追加されません。
  • タイムスタンプ列が null でない属性で追加され、デフォルト値が指定されていない場合。このとき、テーブルにレコードが挿入されたが TIMESTAMP 列に値が指定されていない場合、strict sql_mode が指定されているとエラーが直接報告されます。厳密な sql_mode が指定されていない場合、列に「0000-00-00 00:00:00」が挿入され、警告が生成されます。

time_zone パラメータは、データベースのタイムゾーンを指定します。time_zone は、グローバル レベルとセッション レベルに分かれています。動的に更新できます。デフォルトは SYSTEM で、データベース サービスのタイムゾーンはシステム タイムゾーンと同じになります。 MySQL がタイムスタンプを保存する場合、データベースに保存される実際の時間は UTC 時間です。クエリを実行して表示すると、特定のタイムゾーンに応じて異なる時間が表示されます。設定ファイルに default_time_zone を記述して、タイムゾーンを指定できます。たとえば、中国のタイムゾーン 8 を指定するには、default_time_zone='+8:00' と記述します。以下は、さまざまなタイムゾーンでの時間の表示の簡単なデモンストレーションです。

# 初期デフォルト値mysql> show variables like '%time_zone%';
+------------------+--------+
| 変数名 | 値 |
+------------------+--------+
| システムタイムゾーン | CST |
| タイムゾーン | システム |
+------------------+--------+
セット内の 2 行 (0.00 秒)
mysql> testdb.stu_tb から * を選択します。
+----+--------+----------+------------------------+-------------------------+
| id | stu_id | stu_name | 作成時刻 | 更新時刻 |
+----+--------+----------+------------------------+-------------------------+
| 1 | 1001 | dfdfa | 2020-01-07 17:33:51 | 2020-01-07 17:33:51.63 |
+----+--------+----------+------------------------+-------------------------+
セット内の 1 行 (0.00 秒)
# UTC タイムゾーンに変更して再接続すると、タイムスタンプに保存されている時刻が変更されていることがわかります。mysql> set global time_zone='+0:00';
mysql> '%time_zone%' のような変数を表示します。
+------------------+--------+
| 変数名 | 値 |
+------------------+--------+
| システムタイムゾーン | CST |
| タイムゾーン | +00:00 |
+------------------+--------+
セットに2行(0.01秒)
mysql> testdb.stu_tb から * を選択します。
+----+--------+----------+------------------------+-------------------------+
| id | stu_id | stu_name | 作成時刻 | 更新時刻 |
+----+--------+----------+------------------------+-------------------------+
| 1 | 1001 | dfdfa | 2020-01-07 09:33:51 | 2020-01-07 09:33:51.63 |
+----+--------+----------+------------------------+-------------------------+
セット内の 1 行 (0.00 秒)

3. TIMESTAMP の使用に関するベストプラクティス

TIMESTAMP にはさまざまなバリエーションが使用されています。最もよく使用されるもののいくつかを次に示します。

  • TIMESTAMP デフォルト CURRENT_TIMESTAMP 更新時 CURRENT_TIMESTAMP

このデータ列は、新しいレコードを作成したり、既存のレコードを変更したりするときに更新されます。

  • タイムスタンプ デフォルト CURRENT_TIMESTAMP

新しいレコードを作成するときにこのフィールドを現在の時刻に設定しますが、後で変更するときには更新しないでください。

  • 更新時のタイムスタンプ CURRENT_TIMESTAMP

新しいレコードを作成するときはこのフィールドを 0 に設定し、後で変更するときに更新します。

  • タイムスタンプ デフォルト 'yyyy-mm-dd hh:mm:ss' ON UPDATE CURRENT_TIMESTAMP

新しいレコードを作成するときにこのフィールドを指定された値に設定し、後で変更するときに更新します。

実際には、次のようにテーブルを作成することをお勧めします。

テーブル `table_name` を作成します (
 `increment_id` INT UNSIGNED NOT NULL auto_increment COMMENT '自動増分主キー',
 ...
 `create_time` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '作成時刻',
 `update_time` タイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '変更時刻',
 主キー (`increment_id`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

つまり、データの各行には作成時刻と変更時刻が含まれます。プログラムは、データを書き込むときに指定された作成時刻と変更時刻を表示する必要がなく、デフォルト値が自動的に入力されます。

タイムスタンプに関して、役に立つと思われる提案と経験をいくつか紹介します。

データテーブルにはcreate_timeとupdate_timeのタイムスタンプフィールドがあり、デフォルト値が設定されています。
タイムスタンプ フィールドの場合、データを挿入するときに now() 関数を指定したり挿入したりしないことをお勧めします。
デフォルトでは、explicit_defaults_for_timestamp パラメータは OFF にすることをお勧めします。
中国時間を使用する場合は、time_zone を '+8:00' に設定することをお勧めします。
異なる環境のデータベース タイム ゾーンは一貫性を保ち、データベース タイム ゾーンを勝手に変更しないことをお勧めします。
異なるインスタンス間でデータを移行する場合は、タイムゾーンが同じかどうかに注意してください。
JDBC 接続文字列でタイム ゾーンを指定し、データベースとの一貫性を保つことをお勧めします。

要約:

この記事では、タイムスタンプの使用方法について詳しく説明します。また、タイムスタンプに影響を与えるいくつかのパラメータについても簡単に紹介します。タイムスタンプの使用法と関連する提案が皆さんのお役に立てば幸いです。実際、これらの内容は公式ドキュメントに記録されています。公式ドキュメントを頻繁に読むことができます。

追伸:最近、生計を立てるために広告記事をいくつか投稿しました。気にしないでください。収入があって初めて、執筆を続けるモチベーションが生まれます。この公開アカウントは今後もオリジナルの技術記事に重点を置きます。注意深い読者は、技術記事がほぼ毎週金曜日に公開されることに気付くでしょう。金曜日の記事は絶対に役に立つのでご安心ください。ご協力ありがとうございます。

上記はMySQLタイムスタンプの使用方法の詳細な内容です。MySQLタイムスタンプの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQLテーブルにタイムスタンプを追加するいくつかの方法
  • MySQL における TIMESTAMP の使用法の詳細な説明
  • MySQL のタイムスタンプ精度によって引き起こされた殺人事件の分析
  • MySQL データ挿入の上書きとタイムスタンプの問題と解決策

<<:  ElementuiはデータをxlsxとExcelテーブルにエクスポートします

>>:  Linux のごみ箱メカニズムの実装プロセスと使用方法の詳細な説明

推薦する

Mysql ALTER TABLE はフィールドを追加するときにテーブルをロックしますか?

目次MySQL 5.6以前MySQL 5.6以降要約する知らせMySQL 5.6以前更新手順元のテー...

HTMLページの文字セットを指定する2つの方法

1. HTMLページの文字セットを指定する2つの方法方法1: <メタ文字セット="u...

Vue はアップロードされた画像に透かしを追加する機能を実装します

この記事では、Vueでアップロードされた画像に透かしを追加する具体的な実装コードを参考までに共有しま...

CentOS 7.5 に Docker をインストールする詳細なチュートリアル

Docker入門Docker は、アプリケーションをより速く配信するのに役立つオープンソースのコンテ...

docker run によって起動されたコンテナがハングしてデータが失われた場合の対処方法

シナリオの説明あるシステムでは、機能サービスはdocker stack deploy xxxで起動し...

CSS が初期読み込み時の白い画面の時間に与える影響

外部 CSS ファイルを使用したレンダリング パイプライン上図では、HTML データの要求から DO...

MySQL インデックスの左端原則のサンプルコード

序文最近、MySQL のインデックスについて読んでいました。結合されたインデックスを見ると、左端の原...

MySQL 接続で認証失敗エラーが発生する場合の分析と解決方法

[問題の説明]アプリケーション側では、次のエラーが時々表示されます。メソッド 'mysql_...

MySQL count(1)、count(*)、count(field)の違い

目次1. COUNTの初見2. COUNT(フィールド)、COUNT(定数)、COUNT(*)の違い...

MySQL <> および <=> 演算子の紹介

<> 演算子機能: 等しくないことを示します。注: 「!=」演算子と同じ機能を持ちますが...

入力ファイルの制御と美化について

一部のWebサイトでアップロードする場合、「参照」ボタンをクリックすると、[ファイルの選択]ダイアロ...

JavaScript で DOM 要素を監視する MutationObServer の詳細

1. 基本的な使い方これは MutationObserver コンストラクターを通じてインスタンス化...

ウェブデザインにおける画像フォーマットとデザインの関係を詳しく説明

なぜこの領域のコンテンツを整理したいのでしょうか。それは、油絵の具とキャンバスを理解する必要があり、...

CSS3はシームレスなスクロールと手ぶれ防止を実現します

質問画像とテキストのシームレスなスクロールは、一般的に携帯電話では良い効果をもたらしますが、一部のモ...

MySQLはgroup_concat()関数に基づいて複数のデータ行を結合します

非常に便利な機能group_concat() について、マニュアルには次のように記載されています: ...