2013-03-15 19 views
67

私のテーブルがMySQLエラー1364フィールドは、デフォルト値

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

のように見えてきていないと、私はautoにトリガを持っているが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 

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

答えて

15

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

+0

? –

+0

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

+0

これはルートの問題を解決しません。下のPhyxxのはるかに広範な答えを見てください。 – csvan

160

これは

%はProgramData%\ MySQLの\ MySQLサーバ5.6 \ my.iniファイル

ファイルで定義されてSTRICT_TRANS_TABLES SQLモードによって引き起こされます。その設定を削除してMySQLを再起動すると、問題が解決するはずです。そのファイルを編集しても問題が解決しない場合は

は、設定ファイルの他の可能な場所のためhttp://dev.mysql.com/doc/refman/5.6/en/option-files.htmlを参照して、https://www.farbeyondcode.com/Solution-for-MariaDB-Field--xxx--doesn-t-have-a-default-value-5-2720.html

を参照してください。

+4

データベース管理ツール内で、phpMyAdmin: 'などのSQLクエリを実行できます。 - 以前にモードが設定されていることが確認されました。 select @@ GLOBAL.sql_mode; - 更新モード SET @@ global.sql_mode = 'YOUR_VALUE'; ' – anasanjaria

+3

STRICT_TRANS_TABLESが必要ですか? – Andrew

+0

私の場合、フィールドはDATETIME型でデフォルトはNULLに設定されていますが、同じエラーが表示されています 同じデータベースに2つのスキーマがあります。 1つはステージング用で、もう1つは生産用で、同じテーブル構造を使用します。 これは1つのスキーマで動作しますが、両方で同じテーブル構造を持つ別のスキーマでは機能しません。私は困惑しています.. STRICT_TRANS_TABLESの問題であるとは確信していません – dresh

24

私は自作でインストールmysql5.6.20でこの同じ問題を抱えていたとき、私はそうのような行検索の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 

エラーが発生しました!

71

phpmyadminを開いて[その他]タブを開き、[変数]サブメニューを選択します。 下にスクロールしてSQLモードを見つけます。 SQLモードを編集し、 'STRICT_TRANS_TABLES'を削除してください 保存してください。

+12

この質問はMySQLに関するもので、phpmyadminの記載はありません。みんなが走っているとは思わないでください。 – Chris

+1

@ jackadams49この変更は適用されません。この変更をシステムの再起動時に生き残るためにあなたがしたことを私に助言できますか? –

+4

@ jackadams49に '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 "を追加して保存して終了し、mysqlの' sudo service mysql restart' – maan81

4

これは、に起因すると思わ長年トリガがNOT NULL列ために処理されていない

と題し、bug (#6295) in MySQL(2004年以降)。

は、それは、伝えられるところでは、MySQLは、「SQLあたりの標準」(同上)として動作すること、2013年にバージョン5.7.1 of MySQL (Changelog, last entry)で修正されました。phpmyadminので

+0

私は5.6から5.7.11にアップグレードしましたが、問題は修正されました(STRICT_TRANS_TABLESの削除は私のためには機能しませんでした)ので、私はこれをアップして残りの回答をdownvotingします – knocte

+4

@knocte誰もMySQLをアップグレードできません彼のシステムでは、このためにダウン投票する価値はありません。 – JulienD

19

、次の手順を実行します。

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' 
+0

yaですが、rootアカウントのスーパーアカウント – user889030

+0

でphpmyadminにログインする必要があります。このソリューションは、私のためにUbuntu 16.04で動作しました。すばらしいです ! –

+2

'phpmyadmin'はまったく必要ありません。これらのコマンドは' mysql'コマンドラインで使います。 – gustyaquino

7

その作業や設定ファイルにコピーをテストした:/etc/mysql/my.cnf OR /bin/mysql/my.ini

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

は、MySQLの

を再起動します
0

フィールドをnullに設定して問題を解決すると、情報が格納されるように命令されたときに更新され、フィールドが空であることを示すmsqliメッセージが表示されなくなりました。一部のプロジェクトでは、プロジェクトの構造によって異なります。 :私は、私はこれが最善の解決策であるかどうかわからないんだけど、WindowsのWampServerユーザーの場合

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

WAMP> MySQL> my.ini

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

コメントを外してください。

+0

データベースに接続した直後に、スクリプトの開始時に1回だけ実行し、「フィールドにはデフォルト値がありません」がなくてもすべての挿入クエリが機能します。エラー。 –

+0

テーブルを変更する必要がないので、このソリューションは問題ありません(変更するフィールドが多数ある可能性があります)。 ' ""=' SQL-モード= "STRICT_ALL_TABLES、ERROR_FOR_DIVISION_BY_ZERO、NO_ZERO_DATE、NO_ZERO_IN_DATE、NO_AUTO_CREATE_USER" SQLモード= "STRICT_ALL_TABLES、ERROR_FOR_DIVISION_BY_ZERO、NO_ZERO_DATE、NO_ZERO_IN_DATE、NO_AUTO_CREATE_USERを" '' SQL-モードへ: –

4

SET SQL_MODE = ''; 

をラインの下に追加し、私の問題を解決し、すべての挿入アクションの前に

+0

は私のバージョンでは、私は変更しなければなりませんでした。 'sql-mode =" "'のコメントを外してエラーが発生しました。 – Julian

0

はあなたのクエリを変更して「無視」を追加:Javaプログラムのデフォルト値を設定する方法

INSERT IGNORE INTO `mytable` ( `field1` , `field2`) VALUES ('value1', 'value2'); 
関連する問題