MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで既存カラムからON UPDATE CURRENT_TIMESTAMPを削除する方法

ON UPDATE CURRENT_TIMESTAMPとは

ON UPDATE CURRENT_TIMESTAMPは、明示的なタイムスタンプを指定せずにレコードを更新した場合に、そのカラムの値が自動的に現在の日時へ更新されるよう定義する属性です。この設定を解除したい場合は、ALTER文(ALTER TABLE)を使用してカラム定義を変更することで実現できます。

ON UPDATE CURRENT_TIMESTAMPを削除する構文

基本となる構文は以下のとおりです。

ALTER TABLE テーブル名
CHANGE タイムスタンプカラム名 タイムスタンプカラム名 timestamp NOT NULL default CURRENT_TIMESTAMP;

ポイントは、CHANGE句で同じカラム名を2回指定し、そのうえで「on update CURRENT_TIMESTAMP」を含まない新しい定義を記述する点です。これにより、自動更新の属性だけが取り除かれます。

実際に試してみる:サンプルテーブルの作成

それでは、上記の構文を理解するために、実際にテーブルを作成して動作を確認していきましょう。まずはテーブル作成用のクエリです。

mysql> create table removeOnUpdateCurrentTimeStampDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Name varchar(20),
    -> UserUpdateTimestamp timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
    -> );
Query OK, 0 rows affected (0.54 sec)

このテーブルでは、UserUpdateTimestampカラムに「default CURRENT_TIMESTAMP」と「on update CURRENT_TIMESTAMP」の両方が設定されています。

DESCコマンドでテーブル構造を確認

DESCコマンドを使って、テーブルの構造を確認してみましょう。

mysql> desc removeOnUpdateCurrentTimeStampDemo;

実行結果は以下のとおりです。

+---------------------+-------------+------+-----+-------------------+-----------------------------+
| Field               | Type        | Null | Key | Default          | Extra                       |
+---------------------+-------------+------+-----+-------------------+-----------------------------+
| Id                 | int(11)    | NO   | PRI | NULL            | auto_increment            |
| Name               | varchar(20) | YES |    | NULL            |                           |
| UserUpdateTimestamp | timestamp  | NO  |    | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+---------------------+-------------+------+-----+-------------------+-----------------------------+
3 rows in set (0.04 sec)

Extraフィールドに「on update CURRENT_TIMESTAMP」が表示されているのが確認できますね。ここから、この属性を削除していきます。

ALTER文でON UPDATE CURRENT_TIMESTAMPを削除する

ON UPDATE CURRENT_TIMESTAMPを削除するクエリは以下のとおりです。

mysql> alter table removeOnUpdateCurrentTimeStampDemo
    -> change UserUpdateTimestamp UserUpdateTimestamp timestamp NOT NULL default CURRENT_TIMESTAMP;
Query OK, 0 rows affected (0.16 sec)
Records: 0 Duplicates: 0 Warnings: 0

変更後、もう一度DESCコマンドでテーブル構造を確認します。

mysql> desc removeOnUpdateCurrentTimeStampDemo;

実行結果は以下のとおりです。

+---------------------+-------------+------+-----+-------------------+----------------+
| Field               | Type        | Null | Key | Default          | Extra          |
+---------------------+-------------+------+-----+-------------------+----------------+
| Id                 | int(11)    | NO   | PRI | NULL            | auto_increment |
| Name               | varchar(20) | YES |    | NULL            |               |
| UserUpdateTimestamp | timestamp  | NO  |    | CURRENT_TIMESTAMP |              |
+---------------------+-------------+------+-----+-------------------+----------------+
3 rows in set (0.00 sec)

Extraフィールドが空になり、「on update CURRENT_TIMESTAMP」が正常に削除されたことがわかります。デフォルト値としてのCURRENT_TIMESTAMPは残っているため、INSERT時には現在日時が自動的に設定されます。

デフォルト値(CURRENT_TIMESTAMP)も一緒に削除する場合

さらに、デフォルト値のCURRENT_TIMESTAMPも削除したい場合は、次のようなクエリを実行します。

mysql> alter table removeOnUpdateCurrentTimeStampDemo
    -> change UserUpdateTimestamp UserUpdateTimestamp timestamp NOT NULL;
Query OK, 0 rows affected (0.12 sec)
Records: 0 Duplicates: 0 Warnings: 0

再度DESCコマンドで確認してみましょう。

mysql> desc removeOnUpdateCurrentTimeStampDemo;

実行結果は以下のとおりです。

+---------------------+-------------+------+-----+---------+----------------+
| Field               | Type        | Null | Key | Default | Extra         |
+---------------------+-------------+------+-----+---------+----------------+
| Id                 | int(11)    | NO   | PRI | NULL   | auto_increment |
| Name               | varchar(20) | YES |    | NULL   |              |
| UserUpdateTimestamp | timestamp  | NO  |    | NULL   |              |
+---------------------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

上記の出力結果のとおり、DefaultもExtraもNULL表示となり、ON UPDATE CURRENT_TIMESTAMPおよびデフォルト値の両方が完全に削除されました。

まとめ

  • ON UPDATE CURRENT_TIMESTAMPを削除するには、ALTER TABLE文のCHANGE句で「on update CURRENT_TIMESTAMP」を含まないカラム定義を再指定します。
  • デフォルト値CURRENT_TIMESTAMPのみを残したい場合は「timestamp NOT NULL default CURRENT_TIMESTAMP」を、デフォルト値ごと削除したい場合は「timestamp NOT NULL」を指定します。
  • 変更後は必ずDESCコマンドでテーブル構造を確認し、意図したとおりに属性が削除されているかチェックしましょう。
  1. MySQLで日付型(DATE)カラムを更新する方法をわかりやすく解説

    MySQLでは、DATE_ADD()関数とUPDATE文を組み合わせることで、日付型(DATE)カラムの値を簡単に更新できます。この記事では、実際のSQL実行例を交えながら、日付カラムに1年を加算して更新する手順を解説します。 1. テーブルを作成する まず、日付型カラムを持つテーブルを作成します。 mysql> create table DemoTable1451 -> ( -> JoiningDate date -> ); Query OK, 0 rows affected (0.52 sec) ここでは「JoiningDate(入社日)」と

  2. MySQLで予約語「from」を列名として使用する方法

    MySQLで「from」を列名として使うには? MySQLでは「from」は予約語(リザーブドワード)として登録されているため、そのまま列名として使用するとエラーが発生します。しかし、バッククォート(`` ` ``)で囲むことで、予約語である「from」を列名として扱うことができます。 この記事では、実際にテーブルを作成し、「from」を列名としてデータの挿入や取得を行う手順を解説します。 1. バッククォートを使ってテーブルを作成する まず、列名「from」をバッククォートで囲んでテーブルを作成します。以下のSQLを実行してください。 mysql> create table Demo