PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

La colonna di rilascio non rimuove completamente i riferimenti di colonna - postgresql

Non scherzare mai con pg_attribute direttamente. Se lo hai fatto, probabilmente è il momento di ripristinare da un backup.

Quando una colonna viene eliminata, PostgreSQL non la rimuove effettivamente, ma cambia il nome e la contrassegna come eliminata.

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)

Quindi suppongo che la colonna eliminata conti ancora ai fini del limite di colonna.

Mi viene in mente un modo, non molto comodo, per liberarmene:

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;