我有两张桌子:
CREATE TABLE public.organization
(
id_organization SERIAL PRIMARY KEY,
name varchar,
country varchar,
prod_id varchar
);
CREATE TABLE public suborganization
(
id_suborganization SERIAL PRIMARY KEY,
id_organization bigint references organization(id_organization) ON UPDATE CASCADE ON DELETE CASCADE,
full_address varchar,
prod_id varchar
);
两个表都与suborganization.id_organization分开填充。我尝试使用以下语句填充此列:
UPDATE suborganization SET id_organization = organization.id_organization
FROM organization
WHERE suborganization.prod_id = organization.prod_id;
但是,Postgres正在生成以下错误消息并且无法填充外键:
ERROR: out of memory
DETAIL: Failed on request of size 8
这些是大型表,大约有2亿行,但是我在一台机器上运行它,内存为62.8GB,work_mem设置为4MB。
任何人都可以解释为什么我收到此错误消息?它只是一个硬件问题还是我需要重新配置postgres?或者是我的方法是有缺陷的,有没有更好的方法来创建这个外键?
在Red Hat Enterprise Linux Server 6.7上运行的PotgreSQL 9.4.7
答案 0 :(得分:0)
这是由on update cascade
选项引起的,该选项主要通过"""触发。
需要触发触发器的行列表保存在内存中,这就是占用内存的内容。
尝试删除FK约束的cascade
选项。或者批量更新例如一百万。