1. ホーム
  2. mysql

[解決済み] DATEまたはDATETIMEにデフォルト値を設定するとMySQLでエラーが発生する。

2022-04-25 13:44:49

質問

MySql Server 5.7.11を使用しているのですが、この文章は?

updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'

ない が動作しています。エラーが表示されます。

ERROR 1067 (42000): Invalid default value for 'updated'

しかし、次のように

updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'

動作確認済み .

DATEも同じケースです。

として 副音声 に記載されています。 MySQLドキュメント :

DATE型は、日付部分はあるが時間部分がない値に使用されます。MySQL は 'YYYY-MM-DD' フォーマットで DATE 値を取得し、表示します。サポートされる範囲は '1000-01-01' から '9999-12-31' までです。

とも言われても。

無効なDATE、DATETIME、TIMESTAMPの値は、適切な型('0000-00-00'または'0000-00-00 00:00:00')の「ゼロ」値に変換されます。

MySQL ドキュメントからの 2 つ目の引用も考慮に入れて、なぜそのようなエラーが発生するのか、どなたか教えていただけませんか?

解決方法は?

このエラーは、最新のMYSQL 5.7のドキュメントにあるように、SQLモードがストリクトモードであることが原因です。

MySQL ドキュメント 5.7 によると :

Strictモードは、サーバーが'0000-00-00'を有効な日付として許可するかどうかに影響します。 厳密モードが有効でない場合、'0000-00-00' は許可され、挿入時に警告が発生することはありません。 ストリクトモードが有効な場合、'0000-00-00' は許可されず、IGNORE が指定されない限り、挿入はエラーになります。INSERT IGNOREとUPDATE IGNOREの場合、'0000-00-00'は許可され、挿入すると警告が発生します。

MYSQLのモードを確認するには

SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session

STRICT_TRANS_TABLES モードの無効化

ただし 0000-00-00 00:00:00 を無効にする必要があります。

コマンドで

SET sql_mode = '';

または

SET GLOBAL sql_mode = '';

キーワードの使用 GLOBAL スーパープレビリンが必要で、その時点からすべてのクライアントが接続する操作に影響します。

上記がうまくいかない場合は、次のようにします。 /etc/mysql/my.cnf (ubuntuのように)コメントアウトしてください。 STRICT_TRANS_TABLES

また、サーバー起動時に恒久的にsqlモードを設定したい場合は、以下のように記述します。 SET sql_mode=''my.cnf LinuxまたはMacOSの場合。Windowsの場合、これは my.ini ファイルを作成します。

備考

ただし、MYSQL 5.6ではストリクトモードはデフォルトで有効になっていません。そのため、以下のようなエラーは発生しません。 MYSQL 6 ドキュメント と書かれています。

MySQL では、「ゼロ」値である「0000-00-00」を「ダミーの日付」として保存することができます。これは、場合によっては NULL 値を使用するよりも便利で、データおよびインデックス領域の使用量も少なくなります。0000-00-00」を使用しないようにするには、NO_ZERO_DATE SQLモードを有効にします。

アップデイト

Dylan-Suさんに言われたバグの件ですが。

これはバグではなく、MYSQLが時代とともに進化し、製品のさらなる改善に基づいていくつかの点が変更されたためだと思います。

しかし、私はもう一つ関連するバグレポートを持っています。 NOW() 機能

DatetimeフィールドがデフォルトのNOW()を受け付けない

その他の便利な情報 [参照 TIMESTAMPとDATETIMEの自動初期化・自動更新機能 ]

MySQL 5.6.5 では、TIMESTAMP および DATETIME カラムは自動的に初期化され、現在の日付と時刻(つまり、現在のタイムスタンプ)に更新することができます。5.6.5以前では、これはTIMESTAMPのみで、1つのテーブルにつき最大1つのTIMESTAMPカラムに当てはまります。以下のノートでは、まずMySQL 5.6.5以降の自動初期化および自動更新について説明し、次に5.6.5以前のバージョンでの相違について説明します。

NO_ZERO_DATEに関するアップデート

MySQL 5.7.4以降、このモードは非推奨となりました。以前のバージョンでは、設定ファイルの該当行をコメントアウトする必要があります。参照 NO_ZERO_DATEに関するMySQL 5.7ドキュメント