「create_date」タイムスタンプフィールドの無効なデフォルト値


186

次のsql createステートメントがあります

mysql> CREATE  TABLE IF NOT EXISTS `erp`.`je_menus` (
    ->   `id` INT(11) NOT NULL AUTO_INCREMENT ,
    ->   `name` VARCHAR(100) NOT NULL ,
    ->   `description` VARCHAR(255) NOT NULL ,
    ->   `live_start_date` DATETIME NULL DEFAULT NULL ,
    ->   `live_end_date` DATETIME NULL DEFAULT NULL , 
    ->   `notes` VARCHAR(255) NULL ,
    ->   `create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
    ->   `created_by` INT(11) NOT NULL ,
    ->   `update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,
    ->   `updated_by` INT(11) NOT NULL , 
    ->   `status` VARCHAR(45) NOT NULL ,
    ->   PRIMARY KEY (`id`) ) 
    -> ENGINE = InnoDB;

次のエラーを与える

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

ここのエラーは何ですか?


私はあなたのクエリで何も問題を見つけることができず、テストしたばかりの5.1.50コミュニティで動作します。
Jaspreet Chahal

クエリは私の最後でも大丈夫です。
Shakti Singh

確かではありませんが、そのフィールドに別の名前を付けてみてください。
Naveen Kumar

私はubuntu 10.04でmysql 5.1.56コミュニティを使用しています。機能していません
ロバート

5
ゼロなしの日付には日付が必要です。「1970-01-01 00:00:01」を使用します。[ここから取っ] [1] [1]:dba.stackexchange.com/questions/6171/...
Jadeye

回答:


176

これは、サーバーのSQLモード-NO_ZERO_DATEが原因です。

参照から:NO_ZERO_DATE-厳格モードでは'0000-00-00'、有効な日付として許可しないでください。IGNOREオプションを使用してゼロの日付を挿入することもできます。厳密モードでない場合、日付は受け入れられますが、警告が生成されます。


19
無視オプションを指定するにはどうすればよいですか?
ロバート

9
このオプションは無視できません。これはサーバーオプションです。my.ini(mysql構成ファイル)にアクセスできる場合は、sql-modeオプションからNO_ZERO_DATEを削除してサーバーを再起動します。
Devart

7
このオプションをチェックするには、SHOW VARIABLES LIKE 'sql_mode'
Devart

6
mysqlワークベンチを使用してスクリプトを生成しました。スクリプトでは、sql_modeは従来型に設定されています。従来のコードを削除すると、スクリプトは機能します。
ロバート

17
MySQL Workbench設定で、タブ「モデル:MySQL」に移動します。「生成されたスクリプトで使用するSQL_MODE」を「STRICT_TRANS_TABLES、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION」に設定し、問題を完全に解決します。
sgtdck 2014年

140

MySQLワークベンチからスクリプトを生成した場合。

次の行が生成されます

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

SQL_MODEからTRADITIONALを削除すると、スクリプトは正常に機能します

そうでない場合、SQL_MODEを「無効な日付を許可する」として設定できます

SET SQL_MODE='ALLOW_INVALID_DATES';

1
なぜ地獄が機能しないのかを検索する時間を節約しました:)
Srneczek

5
あぁ、ありがとう。SET SQL_MODE = 'ALLOW_INVALID_DATES'; 命の恩人でした。ワードプレスサイトを別のサーバー(両方ともローカル)に移行しようとしたときにこの問題が発生し、このエラーが発生したテーブルに行がなかったとしても、このエラーが原因でデータベースデータをインポートできませんでした。
mikato

魅力のように働いた!ありがとうございました。
moreirapontocom

52

TIMESTAMPの範囲は、 '1970-01-01 00:00:01' UTCから '2038-01-19 03:14:07' UTCです(ドキュメントを参照)。デフォルト値はその範囲内である必要があります。

その他の奇妙な関連する動作:

CREATE TABLE tbl1 (
    ts TIMESTAMP);  
Query OK, 0 rows affected (0.01 sec)

CREATE TABLE tbl2 (
    ts TIMESTAMP,
    ts2 TIMESTAMP);
ERROR 1067 (42000): Invalid default value for 'ts2'

CREATE TABLE tbl3 (
    ts TIMESTAMP,
    ts2 TIMESTAMP DEFAULT '1970-01-01 00:00:01');
Query OK, 0 rows affected (0.01 sec)

補足:NULLを挿入する場合:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);

1
これは私に起こっています。何が起こってるの?ts2は「NOT NULL」でもありません...!
PedroD 2018年

2
「テーブルの最初のTIMESTAMP列に値を設定しない場合、MariaDBは問題の行でUPDATEまたはINSERTクエリを実行するときに、現在の日付と時刻を自動的に割り当てます。」– MariaDBドキュメント
jsphpl 2018

1
の使用が好きですcolumn_name TIMESTAMP DEFAULT NOW()。すべての状況に適しているとは限りませんが、私もこれを扱っていたので、共有したいと思いました。
DeezCashews

1
column_name TIMESTAMP DEFAULT '1970-01-01 00:00:01'が私にとってはトリックでした。ありがとう!
metafa

42

Ubuntuのデスクトップ16.04で、私はこれをしました:

  1. ファイルを開く:/etc/mysql/mysql.conf.d/mysqld.cnfお好みのエディターで。

  2. を探します:sql_mode、それはのどこかにあり[mysqld]ます。

  3. sql_mode次のように設定します。

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. mysqlサービスを保存して再起動します。

    sudo service mysql restart


8
sql_modeubuntu16.04上のmySQLのインスタンスには存在しなかったことを除いて、それは役に立ちました。「NO_ZERO_DATE」を削除して、ファイルにエントリを追加する必要がありました。だから、ここではそれが今どのように見えるかです:ライン以下#Adding NO_ZERO_DATE sql_modeの= ONLY_FULL_GROUP_BY、STRICT_TRANS_TABLES、NO_ZERO_IN_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTIONを取り除くために
OK999

正解です。以前に厳格モードを無効にするために追加しました。この特定の問題のために編集したとき、sql_modeエントリはすでにそこにありました。
Mubashar Abbas 2016

これはバグですか?CURRENT_TIMESTAMPが「0000-00-00 00:00:00」を返すことはありませんか、それとも間違っていますか?mysqld設定を変更する必要があるのはなぜですか?
letsjump 2017年

@letsjump誰かがmysqlサーバーを間違って設定したため。インポートしたデータベースでこの問題が発生しています。列のタイムスタンプのデフォルト値は有効なタイムスタンプ値ではありません。REAL修正は、デフォルトのタイムスタンプを1970のような有効なものに更新することです-利用可能な最も早い日付。一時的な回避策は、データベースのチェックを無効にすることです。
anon58192932

9

OS Xを使用して、コンパイル済みのデフォルトに基づくシステム変数、Homebrewからmysqlをインストールします。解決策は、システム変数「sql_mode」から「NO_ZERO_DATE」を削除することです。

スコープが関係することを覚えておいてください。

セッションのみに影響を与えたい場合は、を使用してください"@@session"。次に例を示します。

SET @@session.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

この場合、セッションが終了しても変更しても影響はありません。他のセッションには影響しません。

すべてのクライアントに影響を与えたい場合"@@global"は、たとえばを使用してください。

SET @@global.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".

この場合、変更後に接続するクライアントにのみ影響し(現在のすべてのクライアントには影響せず)、サーバーが終了すると機能しなくなります。


8

MySQLをHomebrewからインストールすることで、OS Xでこの問題を解決できました

brew install mysql

以下を/usr/local/etc/my.cnfに追加する

sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

MySQLを再起動する

brew tap homebrew/services
brew services restart mysql

7

次のコードを使用して、MySQL 5.7でも同様の問題が発生しました。

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

代わりにこれを使用して修正しました:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP


2
これは、デフォルトで現在に設定するのが理にかなっている場合、実際には最良のオプションだと思いますが、例として、出生タイムスタンプには意味がありません。
ニャー2018

7

この問題を回避するにNO_ZERO_DATEは、mysqlモードの設定から削除する必要があります。

  1. 「phpmyadmin」に移動します。
  2. phpmyadminが読み込まれたら、「変数」タブをクリックします。
  3. 「SQLモード」を検索します。
  4. [編集]オプションをクリックしてNO_ZERO_DATE、構成から(およびその末尾のコンマ)を削除します。

これは、wampまたはxampを使用するローカル環境で非常に一般的な問題です。


6

データベースSQLファイルの先頭に次の行を定義するだけです。

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

それは私のために働いています。


2

厳密なSQLモードを無効にするには

Create disable_strict_mode.cnf file at /etc/mysql/conf.d/

ファイルに次の2行を入力します。

[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

最後に、次のコマンドでMySQLを再起動します。

sudo service mysql restart

1

MySqlインスタンスのタイムゾーン設定を確認したい場合があります。

mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+

私の場合、基盤となるシステムのタイムゾーンがUTCではなくBSTに設定されていることがわかりました。そのため、作成テーブルではデフォルトの「1970-01-01 00:00:01」が1時間強制され、結果として無効なタイムスタンプ値。

私にとっては、実際にはマシンのタイムゾーンをUTCに設定したかったので、それで解決しました。Centos / 7を実行していたので、

# timedatectl set-timezone UTC

そしてすべてを再起動しました。


1

デフォルト値は1000年から開始する必要があります。

例えば、

ALTER TABLE mytable last_active DATETIME DEFAULT '1000-01-01 00:00:00'

これが誰かを助けることを願っています。


1

これを変える:

`create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,

次へ:

`create_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ,
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,

1
口コミから:こんにちは。ソースコードだけで答えないでください。ソリューションがどのように機能するかについて、わかりやすい説明を提供してください。参照:良い回答を書くにはどうすればよいですか?。おかげで
sɐunıɔןɐqɐp

これがWordPressサイトの場合は、コアWordPressテーブルを更新しないでください。多くのプラグインはzeoresの値を想定しているため、WordPressはプラグインを破壊するレガシーな理由でこのデフォルト値を変更できません。WordpressスレッドWordpressサポート。デフォルト値に依存するコードに精通せずにデータベース構造を変更すると、厄介なバグが発生する可能性があります。これは多くの場合解決策として機能するかもしれませんが、他のもので大混乱を壊す可能性があります。普遍的な解決策ではありません。
SherylHohman

0

これを変更するだけです:

`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

このようなものに:

`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',

0

これを変更するだけです:

create_date datetime NOT NULL DEFAULT '0000-00-00 00:00:00'、

このようなものに:

create_date varchar(80)NOT NULL DEFAULT '0000-00-00 00:00:00'、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.