PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Supprimer la colonne ne supprime pas entièrement les références de colonne - postgresql

Ne plaisante jamais avec pg_attribute directement. Si vous l'avez fait, il est probablement temps de restaurer à partir d'une sauvegarde.

Lorsqu'une colonne est supprimée, PostgreSQL ne la supprime pas réellement, mais change le nom et la marque comme supprimée.

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)

Donc je suppose que cette colonne abandonnée compte toujours dans la limite de colonne.

Je peux penser à un moyen, pas très confortable, de s'en débarrasser :

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;