質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

8504閲覧

ActiveRecord登録時にmysqlでwarningが発生しているとエラーとなる件

GOROGORO

総合スコア66

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2016/07/03 05:01

こんにちは、rails 4.1の環境で、ActiveRecordからデータを登録しました。

courseDetail.save

そうしたところ以下のようなエラーが発生しています。

発生したエラー

Failure/Error: courseDetail.save ActiveRecord::StatementInvalid: Mysql2::Error: Field 'course_detail_id' doesn't have a default value: INSERT INTO `course_details` (`course_id`, `created_at`, `latitude`, `longitude`, `updated_at`) VALUES (77, '2016-07-03 04:46:06', 63.42022385786882, -21.691466134842187, '2016-07-03 04:46:06')

mysqlのコンソールから同じsqlを実行するとwarningは出ますが、insert自体はできています。
$ rails dbconsole
mysql> INSERT INTO course_details (course_id, created_at, latitude, longitude, updated_at) VALUES (77, '2016-07-03 04:46:06', 63.42022385786882, -21.691466134842187, '2016-07-03 04:46:06')
mysql> Query OK, 1 row affected, 2 warnings (0.01 sec)
mysql>
mysql> SHOW WARNINGS
-> ;
+---------+------+-------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------+
| Warning | 1364 | Field 'course_detail_id' doesn't have a default value |
+---------+------+-------------------------------------------------------+

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysqlでwarningが出るとrails側ではerrorとなるようですが、そのような仕様なのでしょうか?また、設定等で回避できるものなのでしょうか?
そもそもこのwarningを避けるべきなのかもしれませんが。。。

すいませんが、おわかりになるかた教えてください。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

mysqlでwarningが出るとrails側ではerrorとなるようですが、そのような仕様なのでしょうか?

恐らく、railsは"厳密なSQLモード"でMySQLに接続しているためです。
https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html#sql-mode-strict

厳密モードは、MySQL が INSERT や UPDATE などのデータ変更ステートメントで無効な値または欠落した値を処理する方法を制御します。

"欠落した値"とは、上のリンクで以下のように説明されています。

値の欠落が発生するのは、挿入される新しい行の非 NULL カラムに値が含まれておらず、そのカラムに明示的な DEFAULT 句が定義されていない場合です。

実際、ご提示のINSERT文はcourse_detail_idカラムの値を指定していません。
加えて警告メッセージに

Field 'course_detail_id' doesn't have a default value

とあることから、恐らく'course_detail_id'カラムは
「非 NULL かつ明示的な DEFAULT 句が定義されていない」
はずです。

"厳密なSQLモード"の場合、そのようなINSERT文はエラーとなります。

トランザクションテーブルの場合、STRICT_ALL_TABLES または STRICT_TRANS_TABLES のいずれかが有効なとき、データ変更ステートメント内の無効な値または欠落した値に対してエラーが発生します。ステートメントは中止されてロールバックされます。

非トランザクションテーブルの場合、挿入または更新される最初の行に不適切な値があるとき、どちらのモードでも動作は同じになり、ステートメントが中止されて、テーブルはそのまま変更されません。

逆に、コンソールでMySQLに接続する際はデフォルトのSQLモード(非厳密モード)を使用しているため、警告が発生するだけでINSERTが実行できてしまう状態と思われます。
https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html#sql-mode-setting

MySQL 5.6.6 以降でのデフォルトの SQL モードは NO_ENGINE_SUBSTITUTION で、MySQL 5.6.5 以前では、これは空白です (モードの設定なし)。


また、設定等で回避できるものなのでしょうか?

そもそもこのwarningを避けるべきなのかもしれませんが。。。

INSERT文で、'course_detail_id'カラムの値を明示的に指定してください。

「INSERTする時点では'course_detail_id'カラムの値は決まっていない」
と言うのであれば、 NOT NULL 制約を解除するなど、テーブル定義を見直してください。

投稿2016/07/03 13:26

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問