ERROR 1067 (42000): Invalid default value for 'created_at'のHeroku環境での解消方法

# はじめに
２つの環境でMySQLの構築をする際に表題のエラー
`ERROR 1067 (42000): Invalid default value for 'created_at'`
が出てきました。環境によって解決できるかどうか異なりますが、少なくともherokuでは解決できました。同じような問題に直面した人々の助けに少しでもなるように期待しつつ書いていきます。

# 結論
これだけ見てわかった人はちゃちゃっとそうしましょう。
**ClearDBからJawsDBに変える**
これだけです。

# 発端
この[Herokuデプロイする（工事中）](https://qiita.com/amixedcolor/private/e1ae73d7682d0d0327f0)でデプロイをして、取得したアドオンであるDBのURLに

```zsh:ターミナルなど
mysql -h ホスト名 -u ユーザ名 -p パスワード データベース名
```

で接続して、この[RESTfulなAPIを作る（工事中）](https://qiita.com/amixedcolor/private/d6cd5c55b264617f842d)で作ったcreate.sqlを実行しようとしたら、表題のエラーがでてきました。

実際は、Herokuでデプロイする前にも[無料レンタルサーバー【XFREE(エックスフリー)】](https://www.xfree.ne.jp/)でAPIつくれないかな〜と思い、そのサーバのMySQLで同じcreate.sqlを実行しようとしたところ、同じく表題のエラーが出てきました。
色々調べていくうちに、そもそもここを使わない方がAPI作りやすそうだとなり、ここではなくHerokuを使うことになりました。
そのためここの環境下でDBを変更できるかわかりません。わからないので、このエラーを解決できるかもわかりません。一つ言えることは、**どの環境であれ使用データベースの変更が有効である可能性が高い**ということです。

# 原因（個人の見解）
ClearDBではMySQLのバージョンの5.7以上は有料で、無料のを使ったりしている人はバージョンが低いです。そのため、旧バージョンでは対応していないdefault値にエラーがでてしまいます。

>JawsDB users can choose their database version at provision time by specifying a --version flag. Versions 5.7 and 8.0 are currently supported. If no version flag is supplied, the default database version will be used. The current default database version is 5.7

上記の通りJawsDBでは5.7以上のバージョンも無料なので、それを使うことでこのバグを解消します。JawsDB自体はClearDBと大して変わりないもの（らしい）です。<del>違いが知りたい人は是非調べて私に教えて欲しいものです。</del>

# 手順
1. [Herokuにログイン](https://qiita.com/amixedcolor/items/07464d079638ca3aa8b9#heroku%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3)
2. [既存のClearDBアドオンを削除](https://qiita.com/amixedcolor/items/07464d079638ca3aa8b9#%E6%97%A2%E5%AD%98%E3%81%AEcleardb%E3%82%A2%E3%83%89%E3%82%AA%E3%83%B3%E3%82%92%E5%89%8A%E9%99%A4)
3. [JawsDBアドオンを追加](https://qiita.com/amixedcolor/items/07464d079638ca3aa8b9#jawsdb%E3%82%A2%E3%83%89%E3%82%AA%E3%83%B3%E3%82%92%E8%BF%BD%E5%8A%A0)
4. [Herokuの環境変数（config）を変更](https://qiita.com/amixedcolor/items/07464d079638ca3aa8b9#heroku%E3%81%AE%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0config%E3%82%92%E5%A4%89%E6%9B%B4)
5. [再度create.sqlなどを実行](https://qiita.com/amixedcolor/items/07464d079638ca3aa8b9#%E5%86%8D%E5%BA%A6createsql%E3%81%AA%E3%81%A9%E3%82%92%E5%AE%9F%E8%A1%8C)

# Herokuにログイン
Herokuのウェブページで行っても良いですし、Heroku CLIを用いても構いません。
ウェブページでの方法は直感的にわかると思うので、今回はHeroku CLIを用いた方法を説明します。ウェブページで行う際は、いくつかの種類の中からMySQLを選択していることを確認してくださいね。
***前提条件***
*Heloku CLIがインストールされている*

```zsh:ターミナルなど
heroku login
# heroku: Press any key to open up the browser to login or q to exit: 
```

書いてある通り好きなキーを押します。
するとブラウザでページが立ち上がるので、（ログインしてない人はログインして）loginボタンを押します。

```zsh:ターミナルなど
# Opening browser to https://cli-auth.heroku.com/auth/cli/browser/xxxxxx?requestor=SFMyNTY.g2gDbQAAAA4xMDYuNzIuMTMyLjIyNW4GAMuUppV3AWIAAVGA.02LuBEXq-5kx0VpyPPe-jJriqRbj4uLysvRbd0-PsJk
# Logging in... done
# Logged in as yourmail@example.com
```

以上のように表示され、無事ログインできたことがわかります。

# 既存のClearDBアドオンを削除
以下のようなコードを実行します。

```zsh:ターミナルなど
heroku addons:remove cleardb:プランの名前 --app アプリの名前
```

無料のプランである*ignit*を使っている場合は以下のようになります。

```zsh:ターミナルなど
heroku addons:remove cleardb:ignit --app アプリの名前
```

アプリの名前は`heroku create アプリの名前`でアプリを作った時のものです
このエラーを解消したいアプリの、アプリの名前を使いましょう。

# JawsDBアドオンを追加
以下のようなコードを実行します。

```zsh:ターミナルなど
heroku addons:create jawsdb:プランの名前 --app アプリの名前
```

無料のプランである*kitefin*を使いたい場合は以下のようになります。

```zsh:ターミナルなど
heroku addons:create jawsdb:kitefin --app アプリの名前
```

これで追加されます。

# Herokuの環境変数（config）を変更
以下のようなコードを実行して、URLを確認します。

```zsh:ターミナルなど
heroku config --app アプリの名前 | grep JAWSDB_URL
# JAWSDB_URL: mysql://<username>:<password>@<hostname>:<port>/<db_name>
```

DATABASE_URLを変更し、この[RESTfulなAPIを作る](https://qiita.com/amixedcolor/private/d6cd5c55b264617f842d)のような方法でDBに接続しているなら、DB_USERNAMEなどの変更も行います。ここでは、DATABASE_URLについてのみ記載します。

```zsh:ターミナルなど
heroku config:heroku config:set DATABASE_URL='mysql2://<username>:<password>@<hostname>/<db_name>?reconnect=true' --app アプリの名前
```

`mysql`を`mysql2`にすることや、末尾の`?reconnect=true' --app アプリの名前`を忘れないようにしてください。これで準備は完了です。

# 再度create.sqlなどを実行
以下のコマンドでDBに接続します。ホスト名などは`heroku config ...`で得たURLのものです。

```zsh:ターミナルなど
mysql -h ホスト名 -P ポート番号 -u ユーザ名 -p パスワード データベース名
```

接続できたら、create.sqlの場合は以下のようにして実行します。
sqlファイルを用いない場合など、適宜自分の環境に置き換えて実行したいSQL文を実行してください。

```sql:ターミナルなど
use データベース名
-- Database changed
\. create.sql
-- Query OK, ...
```

以上です。特に別のエラーがなければ、表題のエラーが出ることなく成功すると思います。

# おわりに
最後までご覧いただきありがとうございました。RESTfulなAPIを作る過程で起きたこの出来事でしたが、無事解決できてよかったです。読者の方々も無事解決できていることを祈ります。
実は私はQiitaで書くのはまだ5回にも満たないひよっ子です。
読みにくいところなどございましたら、お気軽にコメントいただければと思います。
お時間があるようでしたらURL先の関連ページも見ていただけますと幸いです。

* [RESTfulなAPIを作る（工事中）](https://qiita.com/amixedcolor/private/d6cd5c55b264617f842d)
* [Herokuデプロイする](https://qiita.com/amixedcolor/private/e1ae73d7682d0d0327f0)

それではまたどこかで。

# 参考
* https://stackoverflow.com/questions/66069651/error-1067-42000-at-line-30-invalid-default-value-for-created-at
* https://qiita.com/nochifuchi/items/573e4630fd5722e41ae8
* https://subscription.packtpub.com/book/virtualization_and_cloud/9781782173458/3/ch03lvl1sec39/removing-the-add-on#:~:text=It's%20also%20possible%20to%20delete,and%20finally%20click%20on%20Save.
* https://qiita.com/reiya018/items/ba8ceaa732edac07e491
* https://qiita.com/yutaono/items/34bdc9383ce5870e7b8b