最近のプロジェクトでは、時間フィールド (日付時刻、タイムスタンプ) は ON UPDATE CURRENT_TIMESTAMP 属性を使用して自動的に更新されています。列のタイムスタンプ。注意すべき点を以下に記録します。
現在のタイムスタンプで更新する時間を設定した場合 (ON UPDATE CURRENT_TIMESTAMP)、フィールドを更新すると、フィールドの値のみが変更され、時間は変更されます。フィールドは UPDATE 操作中に時刻に変更されます。
つまり、フィールドの更新がない場合、更新ステートメントは正常に実行されますが、時刻フィールドは更新されません。
たとえば、新しいテーブルを作成します:
CREATE TABLE `t_temp` ( `id` int(11) NOT NULL DEFAULT '0', `username` varchar(255) DEFAULT NULL, `upd_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '默认取当前时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
次に、データ行を挿入し、更新を実行します。
UPDATE t_temp SET username = 'mm' WHERE id = 1;
時間列が更新されないことがわかります。
同様に、プログラム内では tk-mybatis などのフレームワークを使用していますが、更新メソッド (int updateByPrimaryKeySelective(T Record); メソッドなど) を使用する場合、実際にはフィールドが更新されないにもかかわらず、構文が実行されても、時刻フィールドは更新されません。これはシステム上見落とされやすいものです。
CURRENT_TIMESTAMP() は MYSQL の TIMESTAMP タイプを現在時刻に設定できます。
ON UPDATE は、個人的にはアーティファクトだと思います。通常、特定のフィールドが updateTIme で、最終更新時刻が使用される場合に使用されます。これを ON UPDATE に使用するだけです。この方法では、開発者が自分で処理する必要はなく、MySQL が自動的に処理できます。
最後に、インデックスについて話しましょう。これは Baidu からのものです。誰からのものか忘れました。インデックスは特別なファイルです (InnoDB データ テーブルのインデックスはテーブル スペースのコンポーネントです)。これらには、データ テーブル内のすべてのレコードへの参照ポインターが含まれています。
データベース インデックスは本の目次に似ており、データベース クエリの速度を向上させることができます。インデックスは、クラスター化インデックスと非クラスター化インデックスに分類されます。クラスター化インデックスは、データ ストレージの物理的な場所に従って順序付けされますが、非クラスター化インデックスは異なります。クラスター化インデックスは複数行の取得速度を向上させることができますが、非クラスター化インデックスは、単一行の取得が高速です。
作成するインデックスが多すぎると、各インデックス ファイルを更新する必要があるため、更新および挿入操作の速度に影響します。頻繁に更新と挿入が必要なテーブルの場合、めったに使用されない where 句用に別のインデックスを作成する必要はありません。小さなテーブルの場合、並べ替えのオーバーヘッドはそれほど大きくなく、追加のインデックスを作成する必要はありません。 。
テーブル作成コードは次のとおりです:
CREATE TABLE timeDemo( id VARCHAR(64) NOT NULL, timeTest TIMESTAMP NOT NULL, PRIMARY KEY (id) );
新しいデータを追加する場合:
# 注文テーブルなどの時間を自動的に作成します。注文時の時間を記録したい場合は、このメソッドを使用して処理できます。
updateTime を含む最終更新時刻:
CREATE TABLE timeDemo2( id VARCHAR(64) NOT NULL, createTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(), updateTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(), PRIMARY KEY (id) );
//mysql5.7 以降のバージョンでは問題ありませんが、5.7 未満のバージョンでは問題が発生します
// 5.7 より前のバージョンでは、プログラムを使用して挿入することをお勧めします。
ここでは、5.5 を使用して ON UPDATE の効果を示します
CREATE TABLE timeDemo3( id VARCHAR(64) NOT NULL, updateTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(), PRIMARY KEY (id) );
このテーブル内の一部のデータが変更されると、updateTime の値が自動的に更新されます。
#このレコードが更新されるたびに、updateTime が自動的に更新されるため、プログラマ自身がこれを処理する必要はありません。
ここで、残念ながら多くのインターネット企業が MySQL5.7 以降の使用を好む一方、従来の業界では依然として MySQL5.5 バージョンが使用されていることがわかります。
インデックスキーとインデックスについて話しましょう
CREATE TABLE timeDemo4( id VARCHAR(64) NOT NULL, id2 VARCHAR(64) NOT NULL, updateTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(), PRIMARY KEY (id), KEY(id2) )ENGINE=INNODB DEFAULT CHARSET=utf8
通常のインデックスの唯一の目的は、データアクセスの速度を向上させることです。この種のインデックスは、キーワード KEY または INDEX によって定義されます。したがって、インデックスは、クエリ条件 (WHERE 列 = ...) または並べ替え条件 (ORDER BY 列) で最も頻繁に出現するデータ列に対してのみ作成する必要があります。
インデックスを作成するには、可能な限り、整数型のデータ列など、最も規則的でコンパクトなデータ列を選択する必要があります。
以上が更新時に current_timestamp を使用して MySQL の問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。