Rod aldrig med pg_attribute
direkte. Hvis du har gjort det, er det sandsynligvis tid til at gendanne fra en sikkerhedskopi.
Når en kolonne slettes, fjerner PostgreSQL den faktisk ikke, men ændrer navnet og markerer den som slettet.
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å jeg gætter på, at den droppede kolonne stadig tæller med i kolonnegrænsen.
Jeg kan komme i tanke om en, ikke særlig behagelig, måde at slippe af med det på:
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;