因为我从物化视图Matview
中提取了数千条记录,所以我想使用find_each
将其分解为批量释放内存。
但是,当我运行以下内容时:
Matview.where('p_id > 100').find_each {|m| m }
我得到以下的错误:
PG::SyntaxError: ERROR: zero-length delimited identifier at or near """"
经过研究,我发现你无法在没有主键的桌子上运行find_each
。
我尝试使用以下内容向Matview
添加唯一ID:
CREATE UNIQUE INDEX index_mv ON matview(p_id)
虽然成功了,但却没有替代主键。
我尝试使用以下内容向主题化视图添加主要约束:
ALTER MATERIALIZED matview ADD CONSTRAINT mv_pk primary key (p_id) disabled
但那失败了。
所以一般来说,我的问题是,如何在物化视图上运行find_each
,具体来说,如何将主键添加到物化视图以便我可以运行find_each
?
编辑:为清楚起见,我在id
中没有Matview
列。如果我有一个,我听说它可能被活动记录识别为默认主键,但我没有测试过。
答案 0 :(得分:3)
ActiveRecord
并不关心它是否真的是数据库中的主键,但您需要使用primary_key=方法在对象上设置primary_key
字段
类似于:
class Matview < ActiveRecord::Base
self.table_name = 'MATERIALIZED_VIEW_NAME_HERE'
self.primary_key = 'ID_COLUMN_NAME_HERE'
end