Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 迁移以更改字段的默认值并更改所有现有记录';仅当具有旧默认值时,才将s值转换为新默认值。_Mysql_Ruby On Rails - Fatal编程技术网

Mysql 迁移以更改字段的默认值并更改所有现有记录';仅当具有旧默认值时,才将s值转换为新默认值。

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

我需要将字段的默认值从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)
    ,如果不相同,请替换您自己
  • 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
    。第二件事是更长期的,如果您在稍后的时间将模型一起删除,会发生什么?在这种情况下,只剩下使用不存在的模型的迁移。只是想一想。