Emi*_*td. 2 postgresql alter-table postgresql-9.1
我有一个包含 1600 列的表,想在其中添加更多字段,但根据数据库规则,不允许创建更多字段,因为达到了上限。
所以我决定从表中删除一些不需要的字段,并且我做到了。我再次尝试在该表中添加几个字段,但它引发了同样的错误,即有 1600 列,您无法添加更多列。
我浏览了 postgresql“ pg_attribute ”的其他表,所有这些字段都在那里并且删除参数= True。
到目前为止我已经尝试过的
删除约束 将表数据放入另一个表 截断表 重新创建约束 将数据重新复制到主表。
但删除的列仍然存在于 pg_attributes 表中。
我还尝试从pg_attribute中删除该记录,但随后它给了我这样的错误。
Run Code Online (Sandbox Code Playgroud)ERROR: catalog is missing 1 attribute(s) for relid 208996 ********** Error ********** ERROR: catalog is missing 1 attribute(s) for relid 208996 SQL state: XX000为什么我们有这么多列的原因是
我们有 odoo-magento (odoo 使用的 postgresql 数据库)集成,在 magento 中有超过 60000 个产品并具有 3000 个唯一属性,因此在连接器中,所有这些属性都创建为产品表中的字段,并且我已经同步了 magento -> odoo产品数量达到1600个上限。现在我不允许从该表中删除字段。
我已经在 magento-odoo 连接器中解决了这个问题,它只会同步所需的属性,但我应该对已经同步的字段做什么,如何删除它???
即使删除一张桌子也不是一个正确的方法,因为它是巨大且非常重要的桌子,所以我可以冒任何风险。
我想做的事
我想简单地从表中删除这些列,并且需要添加一些其他列。
对于这个问题还有其他可能的解决方案吗?
任何帮助将非常感激。
千万不要直接乱搞pg_attribute。如果您已这样做,则可能是时候从备份进行恢复了。
当删除列时,PostgreSQL 并不实际删除它,而是更改名称并将其标记为已删除。
\n\nCREATE 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)\nRun Code Online (Sandbox Code Playgroud)\n\n所以我猜想删除的列仍然计入列限制。
\n\n我可以想到一种不太舒服的方法来摆脱它:
\n\nBEGIN;\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;\nRun Code Online (Sandbox Code Playgroud)\n