sql >> Database >  >> RDS >> PostgreSQL

Kolom neerzetten verwijdert kolomverwijzingen niet volledig - postgresql

Nooit knoeien met pg_attribute direct. Als je dit hebt gedaan, is het waarschijnlijk tijd om een ​​back-up te herstellen.

Wanneer een kolom wordt verwijderd, verwijdert PostgreSQL deze niet echt, maar verandert de naam en markeert deze als verwijderd.

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)

Dus ik denk dat die weggevallen kolom nog steeds meetelt voor de kolomlimiet.

Ik kan een, niet erg comfortabele, manier bedenken om daar vanaf te komen:

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;


  1. Volgnummers maken in PostgreSQL

  2. Welk MySQL-gegevenstype moet worden gebruikt voor het opslaan van booleaanse waarden

  3. 7 manieren om dubbele rijen in SQL Server te vinden terwijl u een primaire sleutel negeert

  4. Hoe een CSV-bestand in PostgreSQL te importeren