2013-04-24 41 views
13

Tôi tạo ra một sự chuyển đổi mới, nơi được nhắc đếnRails 3.2 + MySQL: Lỗi: Dòng 'created_at' không có một giá trị mặc định: INSERT INTO

... 
t.timestamps 

trong bảng tạo ra được thêm hai cột này

... 
| created_at | datetime | NO (Null) |  | NULL (Default) |     
| updated_at | datetime | NO (Null) |  | NULL (Default) | 
... 

Khi tôi muốn tạo một mục mới, tôi luôn nhận được thông báo lỗi

Mysql2::Error: Field 'created_at' doesn't have a default value: INSERT INTO `table_name` (`first_col`, `second_col`) VALUES ('a', 'b') 

tôi có thiếu cái gì? Tôi đã gửi miniapp này cho một người bạn của tôi và anh ấy có thể chạy thành công nó -> bản ghi được tạo ra trong cơ sở dữ liệu.

Tôi đang thiếu gì?

+0

How are you tạo mục mới? – ericeason

+0

'@photo = Photo.new (params [: photo])' ... '@ photo.save' – user984621

Trả lời

16

Tôi vừa chạy vào nội dung tương tự trên cài đặt MySql mới trên Mac OS.

Cuối cùng tôi đã thu hẹp nó xuống để kết hợp các phiên bản mới hơn của MySql bật "chế độ nghiêm ngặt" theo mặc định và dự án của tôi có một bảng với một số ràng buộc có vấn đề trên đó. Bảng được đề cập là "bảng kết nối" được sử dụng trong mối quan hệ :has_and_belongs_to_many. Bằng cách nào đó bảng đó đã được tạo ra với :created_at:updated_at thuộc tính có hạn chế là :null => false trên chúng. Rails 3.2 không tự động điền các trường dấu thời gian cho các bảng kết nối của các mối quan hệ :habtm. Khi chế độ nghiêm ngặt được tắt MySql sẽ chỉ cư các cols với zeroed ra ngày, như 0000-00-00 00:00:00. Với chế độ nghiêm ngặt bật nó làm tăng một ngoại lệ.

Để khắc phục sự cố, tôi đã chạy di chuyển để cho phép các trường dấu thời gian bị rỗng. Như thế này:

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 

Thành thật mà nói, tốt hơn hết là bạn chỉ cần thả các cột nếu không cần chúng, nhưng chúng tôi có một số trường hợp đặc biệt.

+1

Rất hữu ích cảm ơn bạn. Tôi hy vọng họ sẽ sớm sửa lỗi này. Dưới đây là một cuộc thảo luận về vấn đề này: https://github.com/rails/rails/issues/10307 –

4

để thêm vào câu trả lời của Jeremy, trên một mac bạn có thể loại bỏ chế độ nghiêm ngặt với

> vi /usr/local/opt/mysql/my.cnf 

sau đó thay thế

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 

với

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" 
Các vấn đề liên quan