[解決済み] DATEまたはDATETIMEにデフォルト値を設定するとMySQLでエラーが発生する。
質問
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モードがストリクトモードであることが原因です。
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ドキュメント
関連
-
MySQLでテーブルを削除します。親行が削除または更新できません: 外部キー制約に失敗しました。
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] ブーリアン値を格納するために使用するMySQLデータ型
-
[解決済み] datetimeをdateに変換するにはどうすればよいですか?
-
[解決済み] Pythonで日付をdatetimeに変換する
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
-
[解決済み】MySQLのDatetimeカラムにデフォルト値を設定する方法とは?
-
[解決済み】カラムを変更し、デフォルト値を変更する方法は?
-
[解決済み】datetime datatypeのデフォルト値としてNOW()を設定する?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQL Innodb インデックスメカニズム詳細解説
-
MySQLインストールチュートリアル(Windows用)詳細
-
mysqlのデータ圧縮性能比較 詳細
-
MysqlからElasticsearchにデータを同期させる方法を説明します。
-
面接では選択式で聞かれましたが......。.for updateはテーブルをロックするか、行をロックするか?
-
[解決済み] SQLエラー。ORA-01861:リテラルは、フォーマット文字列01861に一致しません。
-
Mysql がエラーを報告 オペランドには 1 つのカラムが含まれている必要があります。
-
SQL Server のトランザクションは、try キャッチに記述しなければ、中間ステートメントがエラーを報告してもコミットされます。
-
msql クエリでのエラー 'where 節' の不明な列 'yellow fruit'
-
[解決済み] MySQLテーブルへの挿入または存在する場合の更新