pg_attribute
के साथ कभी भी खिलवाड़ न करें सीधे। यदि आपने ऐसा किया है, तो संभवत:बैकअप से पुनर्स्थापित करने का समय आ गया है।
जब कोई कॉलम गिरा दिया जाता है, तो PostgreSQL वास्तव में उसे हटाता नहीं है, लेकिन नाम बदलता है और इसे गिरा हुआ के रूप में चिह्नित करता है।
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)
तो मुझे लगता है कि गिरा हुआ कॉलम अभी भी कॉलम की सीमा में गिना जाता है।
मैं एक के बारे में सोच सकता हूं, जो बहुत सहज नहीं है, इससे छुटकारा पाने का तरीका:
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;