PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Spalte löschen entfernt Spaltenreferenzen nicht vollständig - postgresql

Leg dich niemals mit pg_attribute an direkt. Wenn Sie dies getan haben, ist es wahrscheinlich an der Zeit, von einer Sicherung wiederherzustellen.

Wenn eine Spalte gelöscht wird, entfernt PostgreSQL sie nicht wirklich, sondern ändert den Namen und markiert sie als gelöscht.

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)

Also schätze ich, dass diese gelöschte Spalte immer noch zum Spaltenlimit zählt.

Ich kann mir einen nicht sehr bequemen Weg vorstellen, das loszuwerden:

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;