ActiveRecord は ALTER TABLE ALTER COLUMN ... TYPE をデータベースに送信し、データベースは型変換を実行します。PostgreSQL は次を使用するように変換decimal
されます。int
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 句が必要な場合、ActiveRecord は USING について何も知らないため、手動で ALTER TABLE を発行する必要があります。次に例を示します。
def up
connection.execute(%q{
alter table books
alter column price
type integer
using trunc(price * 100)
})
end