PostgreSQL - Error: functions in index expression must be marked IMMUTABLE

Django の Model クラスで定義した DateTimeField は、syncdb すると PostgreSQL では timestamp with time zone のデータ型カラムになる。

この timestamp 型の created という名前のカラムを次のように date 型にキャストしてインデックスを張ろうとしたら、「Error: functions in index expression must be marked IMMUTABLE」というエラーが出てしまった。

CREATE INDEX idx_users_created ON users ((created::date));

なるほど、この timestamp はタイムゾーンを持ってるから、実行される環境によって値が固定されずインデックスには不向きということかな。

というわけで、PostgreSQL - general - type cast in index この辺りのページを参考にしながら、タイムゾーンを JST に指定してから date 型にキャストするとインデックスを作成することができた。

CREATE INDEX idx_user_created on users (((created at time zone 'JST')::date));

検索時にも select * from users where (created at time zone 'JST')::date = '2011-10-27'; と型キャストすればインデックスが使われる、はず。

Last updated on July 10, 2015