删除列不会完全删除列引用 - postgresql

Emi*_*td. 2 postgresql alter-table postgresql-9.1

我有一个包含 1600 列的表,想在其中添加更多字段,但根据数据库规则,不允许创建更多字段,因为达到了上限。

所以我决定从表中删除一些不需要的字段,并且我做到了。我再次尝试在该表中添加几个字段,但它引发了同样的错误,即有 1600 列,您无法添加更多列。

我浏览了 postgresql“ pg_attribute ”的其他表,所有这些字段都在那里并且删除参数= True。

到目前为止我已经尝试过的

删除约束 将表数据放入另一个表 截断表 重新创建约束 将数据重新复制到主表。

但删除的列仍然存在于 pg_attributes 表中。

我还尝试从pg_attribute中删除该记录,但随后它给了我这样的错误。

ERROR:  catalog is missing 1 attribute(s) for relid 208996

********** Error **********

ERROR: catalog is missing 1 attribute(s) for relid 208996
SQL state: XX000
Run Code Online (Sandbox Code Playgroud)

为什么我们有这么多列的原因是

我们有 odoo-magento (odoo 使用的 postgresql 数据库)集成,在 magento 中有超过 60000 个产品并具有 3000 个唯一属性,因此在连接器中,所有这些属性都创建为产品表中的字段,并且我已经同步了 magento -> odoo产品数量达到1600个上限。现在我不允许从该表中删除字段。

我已经在 magento-odoo 连接器中解决了这个问题,它只会同步所需的属性,但我应该对已经同步的字段做什么,如何删除它???

即使删除一张桌子也不是一个正确的方法,因为它是巨大且非常重要的桌子,所以我可以冒任何风险。

我想做的事

我想简单地从表中删除这些列,并且需要添加一些其他列。

对于这个问题还有其他可能的解决方案吗?

任何帮助将非常感激。

Lau*_*lbe 6

千万不要直接乱搞pg_attribute。如果您已这样做,则可能是时候从备份进行恢复了。

\n\n

当删除列时,PostgreSQL 并不实际删除它,而是更改名称并将其标记为已删除。

\n\n
CREATE TABLE testtab (\n   id integer PRIMARY KEY,\n   dropme text NOT NULL,\n   val text NOT NULL\n);\n\nALTER TABLE testtab DROP dropme;\n\nSELECT attname, attnum, attisdropped\nFROM pg_attribute\nWHERE attrelid = 'testtab'::regclass\n   AND attnum > 0\nORDER BY attnum;\n\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82           attname            \xe2\x94\x82 attnum \xe2\x94\x82 attisdropped \xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x82 id                           \xe2\x94\x82      1 \xe2\x94\x82 f            \xe2\x94\x82\n\xe2\x94\x82 ........pg.dropped.2........ \xe2\x94\x82      2 \xe2\x94\x82 t            \xe2\x94\x82\n\xe2\x94\x82 val                          \xe2\x94\x82      3 \xe2\x94\x82 f            \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n(3 rows)\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我猜想删除的列仍然计入列限制。

\n\n

我可以想到一种不太舒服的方法来摆脱它:

\n\n
BEGIN;\nCREATE TABLE testtab_2 (LIKE testtab INCLUDING ALL);\nINSERT INTO testtab_2 SELECT * FROM testtab;\nDROP TABLE testtab;\nALTER TABLE testtab_2 RENAME TO testtab;\nCOMMIT;\n
Run Code Online (Sandbox Code Playgroud)\n