更改域名更改类型

时间:2011-06-12 20:20:44

标签: postgresql types constraints alter-table

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

一种方法是

  1. 使数据库脱机,
  2. 将架构转储为文本
  3. 编辑文本,将域的类型更改为 VARCHAR(150),
  4. 然后最终重新加载架构 文本。
  5. 那只是一个草图。在真正的数据库中尝试之前在沙盒中练习。

答案 2 :(得分:1)

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

就目前情况而言,你将varchar(25)作为域名别名。

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

现在,您无法更改域的类型,但您可以更改其约束 - 更好的是,将约束放在域上是允许在不需要重写表的情况下更改它们的“技巧”之一。

  1. 创建一个新域名,例如short_string,它是带有 check 约束的varchar的别名
  2. 更改适用的表列并将其类型设置为此新域
  3. 这样,如果您有第二个想法,并决定将最大长度更改为40或60或更改为25,那么您将能够在没有表格重写的情况下这样做。

答案 3 :(得分:0)

不能。而且,除非您真的必须-否则(请参阅下面的警告)。

您想要做的是:

  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;

警告-这是唯一可行的方法,因为我们正在扩展域,以便每个值仍然有效。例如,如果您想使值更短,则面临着使表中的值变为无效的风险。在这种情况下,您需要先使用一些迁移脚本来修复此值