Mysql
 sql >> Base de données >  >> RDS >> Mysql

Rails 3.2 + MySQL :Erreur :le champ 'created_at' n'a pas de valeur par défaut :INSERT INTO

Je viens de rencontrer quelque chose de similaire lors d'une nouvelle installation de MySql sur Mac OS.

Je l'ai finalement réduit à la combinaison de versions plus récentes de MySql activant le "mode strict" par défaut, et mon projet ayant une table avec des contraintes discutables. La table en question était la "table de jointure" utilisée dans un :has_and_belongs_to_many relation. D'une manière ou d'une autre, cette table avait été créée avec :created_at , et :updated_at attributs qui avaient une contrainte :null => false sur eux. Rails 3.2 ne remplit pas automatiquement les champs d'horodatage pour les tables de jointure de :habtm des relations. Lorsque le mode strict est désactivé, MySql remplit simplement les colonnes avec des dates mises à zéro, comme 0000-00-00 00:00:00 . Lorsque le mode strict est activé, une exception est déclenchée.

Pour résoudre le problème, j'ai exécuté une migration pour permettre aux champs d'horodatage d'être nuls. Comme ceci :

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

Honnêtement, il est probablement préférable de simplement supprimer les colonnes si vous n'en avez pas besoin, mais nous avons quelques cas particuliers où elles sont en fait définies manuellement.