mysqlエラー1364フィールドにデフォルト値がありません


113

私のテーブルは

create table try ( name varchar(8), CREATED_BY varchar(40) not null);

次に、CREATED_BYフィールドに自動入力するトリガーがあります

create trigger autoPopulateAtInsert BEFORE INSERT on try for each row set new.CREATED_BY=user();

を使用して挿入を行うと

insert into try (name) values ('abc');

エントリはテーブルに作成されますが、それでもエラーメッセージが表示されます

Field 'CREATED_BY' doesn't have a default value Error no 1364

フィールドをヌル可能にすることなく、またトリガーを削除せずにこのエラーを抑制する方法はありますか?そうしないと、(挿入が行われたとしても)休止状態でこれらの例外が発生し、アプリケーションがクラッシュします。

回答:


28

のデフォルト値を設定するとCreated_By(例:empty VARCHAR)、トリガーは値を常に更新します。

create table try ( 
     name varchar(8), 
     CREATED_BY varchar(40) DEFAULT '' not null
);

Javaプログラムでデフォルト値を設定する方法は?
Nagarajan Shanmuganathan

1
テーブルの定義にデフォルト値が必要(create table try(name varchar(8)、CREATED_BY varchar(40)DEFAULT '' not null))
KinSlayerUY

これは根本的な問題には対処していません。以下のPhyxxによるはるかに広範な回答を参照してください。
csvan 2017

3
Phyxxの答え@csvanいずれかの根本的な原因を解決する根本的な原因は、v5.7.1で修正されたMySQLのバグだったのでしません- B98によって答えを参照してください。stackoverflow.com/a/29854279/5389997 strict_trans_table SQLモードを削除するには、より多くのMySQLになりますデータ品質エラーが発生しやすいので、それを削除することは本当に良いアドバイスではありません。
シャドウ

204

これはSTRICT_TRANS_TABLES

%PROGRAMDATA%\ MySQL \ MySQL Server 5.6 \ my.ini

ファイル。その設定を削除してMySQLを再起動すると、問題が解決するはずです。

https://www.farbeyondcode.com/Solution-for-MariaDB-Field--xxx--doesn-t-have-a-default-value-5-2720.htmlを参照してください

そのファイルを編集しても問題が解決しない場合は、http://dev.mysql.com/doc/refman/5.6/en/option-files.htmlで、構成ファイルの他の可能な場所を確認してください。


5
:あなたは、phpMyAdminのように、データベース管理ツール内でSQLクエリを実行することができます -- verified that the mode was previously set select @@GLOBAL.sql_mode; -- UPDATE MODE SET @@global.sql_mode= 'YOUR_VALUE';
anasanjaria

5
しかし、STRICT_TRANS_TABLESが必要かもしれません。
アンドリュー

私の場合、フィールドのタイプはDATETIMEで、デフォルトはNULLに設定されていますが、同じエラーが引き続き表示されます。同じデータベースに2つのスキーマがあります。1つはステージング用で、もう1つは本番用で、同じテーブル構造です。あるスキーマでは機能しますが、両方でまったく同じテーブル構造を持つ別のスキーマでは機能しません。私は困惑しています。それがSTRICT_TRANS_TABLESの問題かどうかはわかりません
dresh

1
sql_modeで始まる行の/etc/my.cnfからSTRICT_TRANS_TABLESを削除し、mysqlサービスを再起動して問題は解消しました。
Mike Volmar

92

phpmyadminを開き、[詳細]タブに移動して、[変数]サブメニューを選択します。下にスクロールしてSQLモードを見つけます。SQLモードを編集し、「STRICT_TRANS_TABLES」を削除して保存します。


22
この質問はMySQLに関するもので、phpmyadminについては触れていません。誰もがそうしていると思い込まないでください。
Chris

2
@ jackadams49この変更は適用されません。この変更をシステムの再起動後も存続させるために何をしたか教えていただけますか?
LD James

8
@ jackadams49を使用して、mysqlをsudo nano /etc/mysql/my.cnf[mysqld] sql_mode = "ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"sudo service mysql restart
保持

1
追加するために、値sql_modeをnull に変更する必要がありましたsql_mode = ""
maan81

最近、MySQLを5.7にアップグレードしました。多くの問題に直面していました。これでうまくいきました。私の日を救った。
生徒

38

phpmyadminで、次を実行します。

select @@GLOBAL.sql_mode

私の場合、私は以下を得ます:

ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES ,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

この結果をコピーして削除しSTRICT_TRANS_TABLESます。次に、以下を実行します。

set GLOBAL sql_mode='ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

yaしかし、そのためにはrootアカウントでphpmyadminにログインする必要があります:)スーパーアカウント
user889030

1
4時間を費やした後、このソリューションはUbuntu 16.04で私にとってうまくいきました。すごい !
Waleed Ahmed

3
まったく必要ない場合phpmyadminは、mysqlコマンドラインでこれらのコマンドを使用してください。
gustyaquino 2017

4
これは、mysql / server / pcの再起動後にデフォルトにリセットされます。あなたは編集/etc/mysql/mysql.conf.d/mysqld.cnfする必要があり、[mysqldを]の後に次の行を追加します。sql_modeの= 'ONLY_FULL_GROUP_BY、NO_ZERO_IN_DATE、NO_ZERO_DATE、ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER、NO_ENGINE_UBSTITUTION'
waza123

@ waza123による解決策、これはmysql 5.7.20にアップグレードした後に私のために機能します。感謝
フレディカーディアン2017

28

mysql5.6.20をHomebrewと共にインストールしたときに同じ問題が発生したとき、my.cnfに移動して解決しました

nano /usr/local/Cellar/mysql/5.6.20_1/my.cnf

次のような行を見つけます。

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

上記の行をコメントにして、mysqlサーバーを再起動します。

mysql.server restart

エラーがなくなった!


15

mysqlコンソールを実行します。

mysql -u your_username -p

、データベースを選択:

USE your_database;

実行します(これもmysqlコンソールから):

SET GLOBAL sql_mode='';

これにより、strictモードがオフになり、mysqlはこれ以上文句を言いません。

明確にするために、データベースの定義では「このフィールドにはデフォルト値が定義されている必要があります」とあり、上記の手順を実行することでMySqlに「それは無視してください」と言います。したがって、ローカルで簡単な修正を行いたいだけの場合、このソリューションは問題ありません。ただし、通常はデータベース定義を調べて、フィールドに本当にデフォルト値が必要かどうかを確認し、必要な場合は設定する必要があります。また、デフォルト値が必要ない場合は、この要件を削除してクリーンな状態にする必要があります。


ええ、デフォルトを追加しないでください、ルールを削除するだけです。素晴らしいソリューション(皮肉が暗示される)は、これを素晴らしい悪い例にしないでください。
それでも

1
ええ、あなたに同意します。しかし、本番(厳密モードが設定されていない場合)で実行されている他の人のプロジェクトがあり、ローカルで動作する小さな機能やバグ修正を追加したい場合があります。あなたはドラゴンと戦うのではなく、そのダ*ンのことを機能させるだけです。:)
MilanG

そのシナリオについては同意します
zardilior

@zardilior問題は何ですか?ルールが削除された場合、デフォルト値は列のタイプに基づいて選択されます。私はそれについて何も問題を感じていません:/そのルールは理由もなくかなり厳しいです。
Reloecc

1
厳密ではありません。デフォルトを宣言するか、値を指定する必要があります。また、厳密モードはそれ以上のことを行うため、列でデフォルトを宣言したり値を渡したりするのではなく、それを無効にすることは本当にひどいですmor ein prod。そこでmysqlの優れた特性の1つを無効にします
zardilior

13

他の人が言ったように、これはSTRICT_TRANS_TABLESSQLモードが原因です。

STRICT_TRANS_TABLESモードが有効かどうかを確認するには:

SHOW VARIABLES LIKE 'sql_mode';

ストリクトモードを無効にするには:

SET GLOBAL sql_mode='';

テストのために、変数> sql_modeから "STRICT_TRANS_TABLES"を手動で削除しました。
Prem popatia

1
あなたは私の日を救った。
umarbilal

私にとって、2番目のコマンドを実行してsql_mode(最初のコマンド)を確認した後は、何も実行されません。mysqlサービスを再起動した後でも。Debian 9
trainoasis

12

すべての挿入アクションの前に、以下の行を追加して問題を解決しました、

SET SQL_MODE = '';

これが最善の解決策かどうかはわかりませんが、

SET SQL_MODE = ''; INSERT INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');

1
すべての挿入アクションの前にこれを行う必要はありません。データベースに接続した直後に、スクリプトの開始時に一度だけ実行してください。すべての挿入クエリは、「フィールドにデフォルト値がありません」エラーなしで機能します。
ホセカルロスPHP

テーブルを変更する必要がないため、このソリューションは問題ありません(変更するフィールドがたくさんある可能性があります)。
ホセカルロスPHP

11

その作業とテスト済みの構成ファイルへのコピー:/etc/mysql/my.cnf OR /bin/mysql/my.ini

[mysqld]
port = 3306
sql-mode=""

次にMySQLを再起動します


9

クエリを変更し、「IGNORE」を次のように追加します。

INSERT IGNORE INTO  `mytable` (  `field1` ,  `field2`) VALUES ('value1',  'value2');

これは私にとってはうまくいきました-私のPHPスクリプトは中止されましたが、IGNOREを使用すると、新しい行を広告するだけです!では、IGNOREをPHP-MYSQLクエリにハードコード化するのはどの程度「安全」でしょうか。これを使用して、以前は存在しなかった新しい「日」の行を自動追加します
Levchik

@Levchik IGNOREを使用すると、エラーの代わりに、MySQLはエラーの発生時に警告を発行し、何らかの方法で命令を完了しようとします。mysqltutorial.org
Stefan

6

Windows WampServerユーザーの場合:

WAMP> MySQL> my.ini

ファイルを検索 sql-mode=""

コメントを外します。


2
私のバージョンでは、をに変更する必要がありsql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"ましたsql-mode=""。コメントを外すsql-mode=""とエラーが発生しました。
ジュリアン

5

これは、に起因すると思わ長年(2004年以降)のMySQLのバグ(#6295)と題し、

NOT NULL列のトリガーは処理されません

MySQLのバージョン5.7.1(変更ログ、最後のエントリ)で2013年に修正されたとされており、MySQLを「SQL標準ごと」に動作させる(同上)。


私は5.6から5.7.11にアップグレードし、問題は修正された(そしてSTRICT_TRANS_TABLESの削除は私にとってはうまくいかなかった)ので、これを賛成し、残りの回答を
反対票を投じる

5
@knocte誰もが彼のシステムでMySQLをアップグレードできるわけではないので、これを支持してダウン投票する価値はありません。
JulienD 2016年

本当に私を助ける唯一の答え。NOT NULL制約を削除するか、列にデフォルト値を追加すると、問題が修正されました。トリガーは期待どおりに機能します。
Ruslan Stelmachenko

3

Windows Serverでmy.iniを編集します(例:プログラムファイル\ mysql \ mysqlサーバーnn \ my.ini)

単にsql-mode = ""を設定するのではなく、行からSTRICT_TRANS_TABLESを削除し、すべてをそのままにして、サービスユーティリティからMySQLを再起動することをお勧めします。あなたが誰であるか、そしてあなたがしたことを将来のプログラマーのためにコメントを追加してください



一般的には「はい」ですが、私のポイントは、sql-modeのすべての値を空白にするのではなく、STRICT_TRANS_TABLESのみを削除することです。そうしないと、他のサービスに影響を与える可能性があります。
Bill Degnan 2018

1

私はフィールドをnull以外に設定して問題を解決しました。情報を保存するように命令されたときに更新されます。フィールドが値を挿入しなかったため、フィールドが空であるというmsqliメッセージが表示されなくなりました。このソリューションのアプリケーションは一部で機能しますプロジェクトはプロジェクト構造に依存します。


列のdefault属性をからnoneに変更してエラーを解決しましたNULL。高評価の答えでない限り!変数sql_modeを更新しようとすると、共有ホスティングでアクセスが拒否されました。
Rashid

0

データフォルダーにあるmy.iniファイルを変更する問題を解決しました。mysql 5.6の場合、my.iniファイルはbinまたはmysqlインストールフォルダーではなく、dataフォルダーに移動されました。


0

この場合、名前列にはnull値があると思います。

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