gpt4 book ai didi

ruby-on-rails - rails : what happens to data after migrating column from decimal to integer

转载 作者:行者123 更新时间:2023-11-29 11:54:28 26 4
gpt4 key购买 nike

我总是冒着搞砸我的开发数据库 (PostgreSQL) 并重建它的风险,但我想我会先问问是否有人有经验。

理想情况下,所有数据都将被截断为其整数:(例如:5.7 将变为 5)或者它可能会舍入值(5.7 变为 6)?或者它可能只是使所有值无效或归零并且数据丢失?我想最坏的结果是数据不可靠(5.7 变成 23)。

这些类型的迁移是否有一般的经验法则?

class ChangeBookFromDecimalToInteger < ActiveRecord::Migration
def self.up
change_column :book, :price, :integer
end

def self.down
change_column :book, :price, :decimal
end
end

最佳答案

ActiveRecord 会发送一个 ALTER TABLE ALTER COLUMN ... TYPE 给数据库,数据库会进行类型转换。 PostgreSQL 将使用 rounddecimal 转换为 int:

=> create table with_decimal (n decimal(11, 6));
=> insert into with_decimal (n) values (1.0),(1.1),(1.5),(1.6),(1.9);
=> insert into with_decimal (n) values (-1.0),(-1.1),(-1.5),(-1.6),(-1.9);
=> select * from with_decimal;
n
-----------
1.000000
1.100000
1.500000
1.600000
1.900000
-1.000000
-1.100000
-1.500000
-1.600000
-1.900000
(10 rows)

=> alter table with_decimal alter column n type int;
=> select * from with_decimal;
n
----
1
1
2
2
2
-1
-1
-2
-2
-2
(10 rows)

请注意 round(numeric)四舍五入到最接近的整数。

如果您想要特定的转换行为,您应该在 ALTER TABLE 中使用 USING 说明:

The optional USING clause specifies how to compute the new column value from the old; if omitted, the default conversion is the same as an assignment cast from old data type to new. A USING clause must be provided if there is no implicit or assignment cast from old to new type.

如果您需要一个 USING 子句,您必须手动发出 ALTER TABLE,因为 ActiveRecord 对 USING 一无所知,例如:

def up
connection.execute(%q{
alter table books
alter column price
type integer
using trunc(price * 100)
})
end

关于ruby-on-rails - rails : what happens to data after migrating column from decimal to integer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14418399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com