エラー1067(42000):「created_at」のデフォルト値が無効です


102

テーブルを変更しようとすると、エラーが表示されました。

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

私はこのエラーをグーグルで検索しましたが、私が見つけたのは、タイムスタンプを変更しようとしたかのようでした。ただし、ここで新しい列を追加しようとすると、次のエラーが発生します。

mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for 'created_at'

そして、私のテーブルの最後の2つの列があるcreated_atupdated_at

これが私のテーブル構造です:

ここに画像の説明を入力してください


これらの列のデフォルト値は何ですか?テーブルの構造を教えていただけますか?
Priyanshu 2016

@Priyanshuテーブル構造を更新しました
iamsujit 2016

2
最後の2列にデフォルト値current_timestampを設定します。
Priyanshu 2016

回答:


144

問題はsql_modesが原因です。コマンドで現在のsql_modesを確認してください。

show variables like 'sql_mode' ; 

そして、sql_mode " NO_ZERO_IN_DATE、NO_ZERO_DATE "を削除して機能させます。これは、mysqlの新しいバージョンのデフォルトのsql_modeです。

次のコマンドを使用して、sql_modeをrootとしてグローバルに設定できます。

set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

7
私はこれを知っていますが、私のサーバーsql_modeで空白が表示され、まだ機能していません。[サーバーバージョン:5.5.53-0ubuntu0.12.04.1-(Ubuntu)]を使用しています。サーバーのバージョンをアップグレードせずに、誰でも解決策を見つけることができますか?
Priyabrata Atha 2016

グローバルコマンドで確認しましたか?同じセッションのsql_modeには何もありませんか?
Aman Aggarwal 2016

'sql_mode'のようなshow変数をチェックしました; 出力はVariable_name | Value = sql_mode |です。
Priyabrata Atha 2016

2
これは、この回答のために有用であろうstackoverflow.com/questions/2317650/...
Preshan Pradeepa

4
5.7ではうまくいきませんでした。私がそれをグローバルにやらなければならなかったかどうかはわかりません。
ブレット

96

簡単に言うと、ステートメントを実行する前に、これを最初の行に入れてください。

SET sql_mode = '';

それはただ素晴らしかった。ありがとうおい!
Novasol 2018年

7
ヒントをありがとう。ただし、日付制限を削除するNO_ZERO_IN_DATE,NO_ZERO_DATEだけで、他のセキュリティ機能を維持することしかできません。SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
KeitelDOG19年

1
明確にするために、このステートメントは、本番環境ではなく、開発環境でのみ使用する必要があります。
アハメド・モハメド

シンプルでポイントにまっすぐ。
フランクフォタンズ

28

サードパーティのデータベースをインストールしようとしたときに、同じエラーが発生しました。提案された解決策を試しましたが失敗しました。
SET sql_mode = '';

次に、データベースをインストールできるようにする以下のコマンドを試しました
SET GLOBAL sql_mode = '';


1
SET sql_mode = '';現在は非推奨ですが、問題SET GLOBAL sql_mode = ''ありません
VadimAnisimov19年

25

次のコマンドを試して実行してください。

ALTER TABLE `investments` 
MODIFY created_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

そして

ALTER TABLE `investments` 
MODIFY updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

このエラーが発生する理由はcreated_atupdated_atフィールドとフィールドにデフォルト値を設定していないためです。これらの列の値をnullにすることはできないため、MySQLはコマンドを受け入れません。

お役に立てれば。


2
おかげで、賛成、私は私のユースケースでこのソリューションを好みます
ChrisR 2018年

5

私の場合、インポートするファイルがあります。だから私は単にSETsql_mode = '';を追加しました。ファイルの先頭にあり、それは機能します!


5

このクエリを実行します。

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

わたしにはできる


ちなみに、SET time_zone = "+00:00";は必要ありません。
Safak Ciplak

3

あなたはこのようにそれを行うことができます:

 CREATE TABLE `ttt` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `t1` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t2` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t3` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t4` TIMESTAMP  NULL DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
  • TIMESTAMP値はエポック秒として格納されるため、タイムスタンプ値 '1970-01-01 00:00:00'(UTC)は、2番目の#0が '0000-00-00 00:00:00を表すために使用されるため、予約されています。 '。
  • MariaDB 5.5以前では、デフォルト値としてCURRENT_TIMESTAMPが定義されているテーブルごとに1つのTIMESTAMP列しか存在できませんでした。MariaDB 10.0以降、この制限は適用されなくなりました。

参照:https//mariadb.com/kb/en/mariadb/timestamp/

サンプル

MariaDB []> insert into ttt (id) VALUES (1),(2),(3);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB []> select * from ttt;
+----+---------------------+---------------------+---------------------+---------------------+
| id | t1                  | t2                  | t3                  | t4                  |
+----+---------------------+---------------------+---------------------+---------------------+
|  1 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
|  2 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
|  3 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----+---------------------+---------------------+---------------------+---------------------+
3 rows in set (0.00 sec)

MariaDB []>

3

私も同様の問題を抱えていました。以下はそれを解決しました:

変化する:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

に:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

つまり、CURRENT_TIMESTAMPの前後の引用符を削除するだけです。

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


3

@BerndBuffenの回答で述べたように。これはMariaDB5.5の問題です。MariaDB5.5をMariaDB10.1にアップグレードするだけで、問題は解決しました。

CentOS 7 (64ビット)でMariaDB5.5をMariaDB10.1にアップグレードする手順

  1. MariaDBリポジトリに次の行を追加します。

    nano /etc/yum.repos.d/mariadb.repo 次の行を貼り付けます。

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1

  1. すでに実行されている場合は、MariaDBを停止します service mariadb stop
  2. 更新を実行します

    yum update

  3. MariaDBの起動とアップグレードの実行

    service mariadb start

    mysql_upgrade

すべて完了。

MariaDBのバージョンを確認してください: mysql -V


:アップグレードを実行する前に、必ずデータベースのバックアップを作成してください。アップグレードが失敗した場合、または問題が発生した場合、データが失われる可能性があります。




2

Mysql5.7の場合、mysqlコマンドラインにログインしてコマンドを実行します。

mysql> show variables like 'sql_mode' ;

sql_modeでNO_ZERO_IN_DATE、NO_ZERO_DATEが表示されます。

ここに画像の説明を入力してください

mysql confファイルの[mysqld]の下に行を追加して、2つのオプションを削除してみてください。mine(Ubuntu16のmysql5.7)は/etc/mysql/mysql.conf.d/mysqld.cnfです。

ここに画像の説明を入力してください

ここでmysqlを再起動します。できます!


0

Mysql8.0.18の場合:

CURRENT_TIMESTAMP([fsp])

「([fsp])」を削除して、問題を解決しました。


0
  1. まず、ターミナルで次のコマンドを使用している既存のモードを確認します。

    $ mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"

    または

    mysql> show variables like 'sql_mode';

    以下のような出力が表示されます

    ここに画像の説明を入力してください

  2. my.cnfを介してモードを無効にする:この場合、NO_ZERO_IN_DATE、NO_ZERO_DATEモードを削除する必要があります

    my.cnfファイルを開きます(通常、my.cnfファイルは/etc/my.cnfまたは/etc/mysql/my.cnfにあります)

    [mysqld]見出しの下のmy.cnfのモードを更新します

    sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    ここでは、NO_ZERO_IN_DATE、NO_ZERO_DATEモードを省略しています

  3. mysqlサーバーを再起動します

    $ /etc/init.d/mysql restart

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