Mysql 迁移以更改字段的默认值并更改所有现有记录';仅当具有旧默认值时,才将s值转换为新默认值。
我需要将字段的默认值从0更改为3,但关键是我已经有数千条记录,并且希望这些记录仅当记录的默认值为0时才将值从0更改为3,但对于其他值(如1、2),它应该保持不变。我怎么做Mysql 迁移以更改字段的默认值并更改所有现有记录';仅当具有旧默认值时,才将s值转换为新默认值。,mysql,ruby-on-rails,Mysql,Ruby On Rails,我需要将字段的默认值从0更改为3,但关键是我已经有数千条记录,并且希望这些记录仅当记录的默认值为0时才将值从0更改为3,但对于其他值(如1、2),它应该保持不变。我怎么做 ALTER TABLE your_table MODIFY your_column tinyint(1) NOT NULL DEFAULT 3; UPDATE your_table SET your_column=3 WHERE your_column=0; 假设您的列是tinyint(1),如果不相同,请替换您自己 not
ALTER TABLE your_table MODIFY your_column tinyint(1) NOT NULL DEFAULT 3;
UPDATE your_table SET your_column=3 WHERE your_column=0;
tinyint(1)
,如果不相同,请替换您自己notnull
假设您总是强制列为notnull
在迁移过程中,应使用方法change_列更改表设置,如下所示:
change_column :my_models, :attribute_name, :integer, :default => 3
MyModel.update_all({ :attribute_name => 3 }, { :attribute_name => 0 })
然后要更新所有现有记录,而不是遍历所有记录并单独更新它们,您可以使用如下方法更新所有记录:
change_column :my_models, :attribute_name, :integer, :default => 3
MyModel.update_all({ :attribute_name => 3 }, { :attribute_name => 0 })
第一个参数告诉方法要设置什么值,第二个参数告诉方法要更新哪些行的条件。你不能只“更新表集合值=3,其中值=0”吗?我想知道这是否只适用于某些数据库,因为我不确定所有的数据库都允许更改默认值。无论如何,我可以确认它在MySQL上有效。我刚刚试过这个,我想语法可能已经改变了。这对我来说很有用:
MyModel.update\u all({:attribute\u name=>3},{:attribute\u name=>0})
update\u all-in-Rails 4:Model.where(“status=0”).update\u all(status:2)@DanneManne谢谢,Danne可以在迁移文件本身中添加这个吗?@BKSpurgeon当然可以。然而,如果你这样做,有一些事情值得考虑。第一个问题是如何在迁移和回滚之间处理这个问题。简单的答案是不要将此代码放在change
块中,而是在迁移中手动定义up
和down
,并且只在up
方法中调用update\u all
。第二件事是更长期的,如果您在稍后的时间将模型一起删除,会发生什么?在这种情况下,只剩下使用不存在的模型的迁移。只是想一想。