Nunca te metas con pg_attribute
directamente. Si lo ha hecho, probablemente sea el momento de restaurar desde una copia de seguridad.
Cuando se descarta una columna, PostgreSQL en realidad no la elimina, sino que cambia el nombre y la marca como descartada.
CREATE TABLE testtab (
id integer PRIMARY KEY,
dropme text NOT NULL,
val text NOT NULL
);
ALTER TABLE testtab DROP dropme;
SELECT attname, attnum, attisdropped
FROM pg_attribute
WHERE attrelid = 'testtab'::regclass
AND attnum > 0
ORDER BY attnum;
┌──────────────────────────────┬────────┬──────────────┐
│ attname │ attnum │ attisdropped │
├──────────────────────────────┼────────┼──────────────┤
│ id │ 1 │ f │
│ ........pg.dropped.2........ │ 2 │ t │
│ val │ 3 │ f │
└──────────────────────────────┴────────┴──────────────┘
(3 rows)
Así que supongo que esa columna eliminada todavía cuenta para el límite de columnas.
Se me ocurre una forma, no muy cómoda, de deshacerme de eso:
BEGIN;
CREATE TABLE testtab_2 (LIKE testtab INCLUDING ALL);
INSERT INTO testtab_2 SELECT * FROM testtab;
DROP TABLE testtab;
ALTER TABLE testtab_2 RENAME TO testtab;
COMMIT;