Nigdy nie zadzieraj z pg_attribute
bezpośrednio. Jeśli to zrobiłeś, prawdopodobnie nadszedł czas, aby przywrócić z kopii zapasowej.
Kiedy kolumna jest usuwana, PostgreSQL w rzeczywistości jej nie usuwa, ale zmienia nazwę i oznacza ją jako usuniętą.
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)
Sądzę więc, że ta porzucona kolumna nadal liczy się do limitu kolumn.
Przychodzi mi do głowy jeden, niezbyt wygodny sposób na pozbycie się tego:
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;