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 のごみ箱メカニズムの実装プロセスと使用方法の詳細な説明

推薦する

CSS3 境界効果

CSSとは# CSS (Cascading Style Sheets の略) は、「カスケーディング...

CSS マージンの重複とその防止方法

2 つ以上のブロックレベル ボックスの垂直に隣接するエッジが重なり合っています。結果として得られる境...

MySQLクエリ最適化に必須の知識ポイントのまとめ

序文クエリの最適化は一夜にして達成できるものではありません。対応するツールの使い方を学び、他の人の経...

収集する価値のある Linux ドキュメント編集コマンド 27 個

Linux col コマンドLinux の col コマンドは制御文字をフィルタリングするために使用...

vue-cli でレスポンシブ レイアウトを実装する方法

フロントエンド開発を行うと、PCとモバイル端末の適応に必然的に直面することになります。このような問題...

要素の水平方向の中央揃えを実現する3つの方法と、固定レイアウトとフローレイアウトの概念の理解

CSS でテキストを中央揃えにするプロパティは非常に簡単に実現できます。text-align:cen...

モバイル開発チュートリアル: ピクセル表示の問題の概要

序文モバイル端末の開発の過程で、モバイル端末のディスプレイはデスクトップ端末のディスプレイとは一般的...

メンテナンスしやすい CSS コードを書くための 5 つのガイドライン

1. スタイルシートの先頭にコメント ブロックを追加して、スタイルシートの作成日、作成者、タグ、その...

ウェブページのフォント設定についての簡単な説明

サイト全体のフォントを設定することは、常にシンプルでありながら難しい作業です。深く掘り下げていくと、...

Centos7 に Docker をインストールします (2020 の最新バージョンが利用可能、コピーして貼り付けるだけ)

操作については、こちらの公式ドキュメントを参照してください。インストール1. 古いバージョンの do...

CentOS7環境にMySQL5.5データベースをインストールする

目次1. 現在のシステムにMySQLがインストールされているかどうかを確認する2. インストールされ...

MySQL での挿入効率のいくつかの例の比較

序文最近、仕事の都合で、約 1000w の大量のデータを MySQL に挿入する必要があり、時間がか...

JavaScript 変数の昇格についての簡単な説明

目次序文1. どのような変数が促進されますか? 2. 可変プロモーションがあるのはなぜですか? (1...

ウェブページ作成の基本宣言文書型記述(DTD

CSS レイアウトを使用して WEB 標準に準拠した Web ページを作成することは、jb51.ne...