ActiveRecord 将发送一个 ALTER TABLE ALTER COLUMN ... TYPE 到数据库,数据库将执行类型转换。PostgreSQL 将转换decimal
为int
using round
:
=> 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 来说明:
可选USING
子句指定如何从旧列值计算新列值;如果省略,则默认转换与从旧数据类型到新数据类型的赋值转换相同。如果USING
没有从旧类型到新类型的隐式或赋值转换,则必须提供子句。
如果您需要一个 USING 子句,则必须手动发出 ALTER TABLE,因为 ActiveRecord 对 USING 一无所知,例如:
def up
connection.execute(%q{
alter table books
alter column price
type integer
using trunc(price * 100)
})
end