sql >> Databáze >  >> RDS >> PostgreSQL

Zrušit sloupec neodstraní odkazy na sloupce úplně - postgresql

Nikdy si nezahrávejte s pg_attribute přímo. Pokud jste tak učinili, je pravděpodobně čas na obnovení ze zálohy.

Když je sloupec odstraněn, PostgreSQL jej ve skutečnosti neodstraní, ale změní název a označí jej jako odstraněný.

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)

Předpokládám tedy, že vynechaný sloupec se stále započítává do limitu sloupců.

Napadá mě jeden, nepříliš pohodlný způsob, jak se toho zbavit:

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. Jak analyzovat stav databázových indexů

  2. Jak vyloučím víkendové dny v dotazu SQL Server?

  3. Jak získat seznam tabulek bez omezení primárního klíče v databázi SQL Server - SQL Server / Výukový program T-SQL, část 58

  4. Sloupec Postgresql nebyl nalezen, ale zobrazuje se v popisu