PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

A coluna suspensa não remove totalmente as referências de coluna - postgresql


Nunca mexa com pg_attribute diretamente. Se você tiver feito isso, provavelmente é hora de restaurar a partir de um backup.

Quando uma coluna é descartada, o PostgreSQL não a remove, mas altera o nome e a marca como descartada.
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)

Então, acho que a coluna descartada ainda conta para o limite da coluna.

Eu posso pensar em uma maneira, não muito confortável, de se livrar disso:
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;