MySQLでtimestamp型のデフォルト値を「CURRENT_TIMESTAMP」から別のものに変更したい
解決済
回答 3
投稿
- 評価
- クリップ 0
- VIEW 1,363
あるマスタテーブルがあります。
開発当初は参照することしか考えてなかったため、
このテーブルは作成日時カラムにデフォルト値「CURRENT_TIMESTAMP」がついていました。
mysql> DESC example;
+--------------+------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+-------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(30) | YES | | NULL | |
| created_at | timestamp | NO | | CURRENT_TIMESTAMP | |
+--------------+------------------+------+-----+-------------------+----------------+
ですが、今回事情があって、頻繁に更新することになったので、更新日時カラムを設けたいです。
そして、他のテーブルと同じように、作成日時カラムはデフォルト値「0000-00-00 00:00:00」、
更新日時カラムはデフォルト値「CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP」にしたいです。
ということで、次のようなSQL文を発行しました。
ALTER TABLE example ALTER COLUMN created_at SET DEFAULT '0000-00-00 00:00:00',
ALTER TABLE example ADD COLUMN updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
ですが、これを実行すると次のエラーが発生しました。
mysql> ALTER TABLE example ALTER COLUMN create_at SET DEFAULT '0000-00-00 00:00:00';
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE example ADD COLUMN updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
mysql> DESC example;
+--------------+------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+-------------------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(30) | YES | | NULL | |
| created_at | timestamp | NO | | CURRENT_TIMESTAMP | |
+--------------+------------------+------+-----+-------------------+----------------+
作成日時カラムのデフォルト値が「CURRENT_TIMESTAMP」から変わってません。
どういうことですか?MySQLの仕様でしょうか。
どのようにすれば、timestamp型のデフォルト値を変更できますか。
一度、カラムを削除して追加するというのはナシです。
既に本番稼働しているテーブルで、頻繁に参照が発生しているので、
ダウンタイムが極力発生しない方法で解決したいです。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
カラムの定義の変更なので、MODIFY
ではないでしょうか?
ダウンタイムが発生しないかは、確認をお願いします。
ALTER TABLE example MODIFY created_at timestamp DEFAULT '0000-00-00 00:00:00' not null;
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
先ずDEFAULTをDROP してみてはどうでしょうか。
ALTER TABLE example ALTER created_at DROP DEFAULT;
ALTER TABLE example ADD COLUMN updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
ALTER TABLE example ALTER COLUMN created_at SET DEFAULT '0000-00-00 00:00:00';
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
-1
エラーの通りです。
Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
テーブル定義が正しくありません。 DEFAULT句またはONUPDATE句にCURRENT_TIMESTAMPを含むTIMESTAMP列は1つだけです。
既にcreated_atカラムにCURRENT_TIMESTAMPが当てられているので、このCURRENT_TIMESTAMPを解除したうえで、提示のALTER TABLEを発行する必要があります。
それか、created_atカラムのカラム名を変更してupdated_atにし、別途created_atカラムを作るか。
今気づいたのですが、
ALTER TABLE example ALTER COLUMN create_at SET DEFAULT '0000-00-00 00:00:00';
「create_at 」というカラムは存在してないような。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/10/14 13:15
2020/10/14 13:21
https://dev.mysql.com/doc/refman/5.6/ja/alter-table.html
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
出来そうだし、そもそも文法エラーでは無いわけで。
2020/10/14 13:45
DROP はデフォルトの値を設定していない状態にできました。
なので、saziさんの回答内容もやりたいことを実現できると思います。
どっちが良い方法かまでは判断できませんでした。