sql >> Database teknologi >  >> RDS >> PostgreSQL

Drop kolonne fjerner ikke kolonnereferencer helt - postgresql

Rod aldrig med pg_attribute direkte. Hvis du har gjort det, er det sandsynligvis tid til at gendanne fra en sikkerhedskopi.

Når en kolonne slettes, fjerner PostgreSQL den faktisk ikke, men ændrer navnet og markerer den som slettet.

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å jeg gætter på, at den droppede kolonne stadig tæller med i kolonnegrænsen.

Jeg kan komme i tanke om en, ikke særlig behagelig, måde at slippe af med det på:

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. Sådan sender du e-mail ved hjælp af Oracle 10 g Forms

  2. Forstå GROUPING og GROUPING_ID funktioner i SQL Server

  3. Spotlight Tuning Pack Basic:Det bedste gratis SQL-optimeringsværktøj

  4. SQLite indeks