Mysql
 sql >> Database >  >> RDS >> Mysql

Rails 3.2 + MySQL:errore:il campo 'created_at' non ha un valore predefinito:INSERT INTO

Mi sono appena imbattuto in qualcosa di simile su una nuova installazione di MySql su Mac OS.

Alla fine l'ho ristretto alla combinazione di versioni più recenti di MySql che attivano la "modalità rigorosa" per impostazione predefinita e il mio progetto ha una tabella con alcuni vincoli discutibili su di essa. La tabella in questione era la "tabella di unione" usata in un :has_and_belongs_to_many relazione. In qualche modo quella tabella era stata creata con :created_at e :updated_at attributi che avevano un vincolo di :null => false su di essi. Rails 3.2 non compila automaticamente i campi timestamp per le tabelle di join di :habtm relazioni. Quando la modalità rigorosa è disattivata, MySql popolerà semplicemente le colonne con date azzerate, come 0000-00-00 00:00:00 . Con la modalità rigorosa attivata, viene sollevata un'eccezione.

Per risolvere il problema, ho eseguito una migrazione per consentire ai campi del timestamp di essere nulli. In questo modo:

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

Onestamente, probabilmente è meglio eliminare le colonne se non ne hai bisogno, ma abbiamo un paio di casi speciali in cui vengono effettivamente impostate manualmente.