sql >> データベース >  >> RDS >> Mysql

Rails 3.2 + MySQL:エラー:フィールド'created_at'にはデフォルト値がありません:INSERT INTO

    MacOSにMySqlを新規インストールしたときに似たようなものに遭遇しました。

    私はついにそれを、デフォルトで「厳密モード」をオンにする新しいバージョンのMySqlと、いくつかの疑わしい制約のあるテーブルを持つプロジェクトの組み合わせに絞り込みました。問題のテーブルは、:has_and_belongs_to_manyで使用されている「結合テーブル」でした。 関係。どういうわけか、そのテーブルは:created_atで作成されていました 、および:updated_at :null => falseの制約があった属性 それらの上に。 Rails 3.2は、:habtmの結合テーブルのタイムスタンプフィールドに自動的にデータを入力しません。 関係。 strictモードがオフになっている場合、MySqlは、0000-00-00 00:00:00のように、ゼロ化された日付を列に入力するだけです。 。厳密モードをオンにすると、例外が発生します。

    この問題を修正するために、タイムスタンプフィールドをnullにできるように移行を実行しました。このように:

    class ChangeNullableForTimestampsOnThing1sThing2s < ActiveRecord::Migration
      def up
        change_column(:thing1s_thing2s, :created_at, :datetime, :null => true)
        change_column(:thing1s_thing2s, :updated_at, :datetime, :null => true)
      end
    
      def down
        change_column(:thing1s_thing2s, :created_at, :datetime, :null => false)
        change_column(:thing1s_thing2s, :updated_at, :datetime, :null => false)
      end
    end
    

    正直なところ、必要がない場合は列を削除する方がよいでしょうが、実際に手動で設定される特殊なケースがいくつかあります。



    1. PostgreSQL:クエリには結果データの宛先がありません

    2. mysqliの最後の挿入ID

    3. PostgreSQLで短い月の名前を取得する

    4. PHP PDOException:SQLSTATE [HY093]:無効なパラメーター番号