【问题标题】:Alter domain change type更改域更改类型
【发布时间】:2011-06-12 20:20:44
【问题描述】:

有没有办法改变域类型并将类型更改为新类型?我有一个使用具有 VARCHAR(25) 类型的域的列,并且希望将长度增加到 150。

【问题讨论】:

标签: postgresql types constraints alter-table


【解决方案1】:

创建一个新域,用新域更改所有表并删除旧域。

【讨论】:

    【解决方案2】:

    你不能。除非你真的必须 - 你不应该(见下面的警告)。

    你想做的是:

    1. 重命名现有域
    ALTER DOMAIN domain_name RENAME TO doman_name_depricated;
    
    1. 创建一个与前一个同名的新域,保留新的约束
    CREATE DOMAIN doman_name AS VARCHAR(150);
    
    1. 更改使用此域的所有列的类型。
    ALTER TABLE table_name ALTER COLUMN column_name SET DATA TYPE domain_name;
    

    警告 - 这只有在我们扩大域以使每个值仍然有效时才有可能。例如,如果您想缩短值,您将面临表中的值变得无效的风险。在这种情况下,您需要一些迁移脚本来修复此值之前

    【讨论】:

      【解决方案3】:

      这是不可能的,但你可以让它成为可能。

      就目前而言,您将 varchar(25) 别名为您的域。

      varchar(25)、varchar(50)、varchar 和 text 在 Postgres 中的存储方式相同。唯一的区别是长度检查,它增加了前两个的开销。

      现在,您无法更改域的类型,但可以更改其约束 - 更好的是,将约束置于域上是无需重写表即可更改它们的“技巧”之一。

      1. 创建一个新域,比如 short_string,它是带有 check 约束的 varchar 的别名
      2. 更改适用的表列并将其类型设置为此新域

      这样,如果您重新考虑并决定将最大长度更改为 40 或 60 或恢复为 25,则无需重写表即可。

      【讨论】:

      • 在哪里可以找到这个约束?在我的域中,我有检查约束,但找不到使用 varchar(x) 创建的隐式大小约束
      • @AmitGoldstein: postgresql.org/docs/current/sql-createdomain.html 然后您可以通过查看域的定义来查看检查(如果我没记错的话,\d 有效)。
      【解决方案4】:

      一种方法是

      1. 使数据库脱机,
      2. 将架构转储为文本,
      3. 编辑文本,将域类型更改为 varchar(150),
      4. 然后最终从 文本。

      这只是一个草图。在您的真实数据库上尝试之前先在沙盒中练习。

      【讨论】:

        猜你喜欢
        • 2015-04-22
        • 2019-11-30
        • 2014-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-17
        • 1970-01-01
        相关资源
        最近更新 更多