Không bao giờ gây rối với pg_attribute
trực tiếp. Nếu bạn đã làm như vậy, có lẽ đã đến lúc khôi phục từ bản sao lưu.
Khi một cột bị loại bỏ, PostgreSQL không thực sự loại bỏ nó, nhưng thay đổi tên và đánh dấu cột đó là bị loại bỏ.
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)
Vì vậy, tôi đoán rằng cột bị giảm đó vẫn được tính vào giới hạn cột.
Tôi có thể nghĩ ra một cách, không thoải mái lắm, để thoát khỏi điều đó:
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;