sql >> Databasteknik >  >> RDS >> PostgreSQL

Släpp kolumn tar inte bort kolumnreferenser helt - postgresql

Bråka aldrig med pg_attribute direkt. Om du har gjort det är det förmodligen dags att återställa från en säkerhetskopia.

När en kolumn släpps tar PostgreSQL inte bort den, utan ändrar namnet och markerar den som släppt.

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)

Så jag antar att den tappade kolumnen fortfarande räknas till kolumngränsen.

Jag kan komma på ett, inte särskilt bekvämt, sätt att bli av med det:

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. MySQL får saknade ID från tabellen

  2. Vad är en jämförelseoperatör?

  3. PDO::__construct():Servern skickade teckenuppsättning (255) okänd för klienten. Vänligen rapportera till utvecklarna

  4. Uppdatera uttalande med inre koppling på Oracle