Postgresql

當數據保持不變時更改列數據類型而不重寫

  • October 27, 2019

例如:

  • timestamp(tz)int8
  • dateint4
  • jsontext

原始數據沒有改變,唯一的區別是數據的處理方式。所以應該可以乾淨利落地來回切換。

  1. 我如何檢查是否確實如此?
  2. 如果不是這種情況(表被重寫),我如何讓它在不重寫的情況下做到這一點?

就像文件說的那樣:

$$ … $$更改現有列的類型將需要重寫整個表及其索引。作為一個例外,在更改現有列的類型時,如果USING子句不更改列內容並且舊類型要麼是二進制可強制轉換為新類型,要麼是新類型上的無約束域,則不需要重寫表;但仍必須重建受影響列上的任何索引。

所以關鍵是類型轉換是二進制強制的,換句話說,你需要在定義的這些類型之間進行類型轉換WITHOUT FUNCTION

您在問題中提到的數據類型並非如此,但如果您是超級使用者,則可以創建這樣的轉換,然後將其用於ALTER TABLE

CREATE CAST (date AS int4) WITHOUT FUNCTION;
ALTER TABLE mytable ALTER datecol TYPE int4 USING (datecol::int4);
DROP CAST (date AS int4);

當然,您必須了解它的內部表示date才能有意義。

完成後刪除強制轉換是個好主意,因為在 PostgreSQL 中添加類型強制轉換很容易導致類型解析過程中的歧義,從而導致錯誤。

引用自:https://dba.stackexchange.com/questions/241431