如何更改 firebird3 中的列类型

Posted

技术标签:

【中文标题】如何更改 firebird3 中的列类型【英文标题】:How change a column type in firebird3 【发布时间】:2018-06-24 07:52:56 【问题描述】:

从 firebird 3 开始我无法修改列类型

在我使用这种更新之前:

update RDB$RELATION_FIELDS set
RDB$FIELD_SOURCE = 'MYTEXT'
where (RDB$FIELD_NAME = 'JXML') and
(RDB$RELATION_NAME = 'XMLTABLE')

因为我收到 ISC 错误 335545030。

也许火鸟 3 中还有另一种方式?

【问题讨论】:

错误 335545030 是 "系统表 @2 不允许@1 操作" 【参考方案1】:

Firebird 3 不再允许直接更新系统表,因为这可能会破坏数据库。另请参阅发行说明中的​​ System Tables are Now Read-only。您将需要使用 DDL 语句进行修改。

您似乎想将列的数据类型更改为域。为此,您需要使用alter table ... alter column ...。具体来说,您需要这样做:

alter table XMLTABLE
    alter column JXML type MYTEXT;

这确实有一些限制:

更改列的数据类型:TYPE 关键字

关键字 TYPE 将现有列的数据类型更改为 另一种,允许的类型。可能导致数据丢失的类型更改 将被禁止。例如,新的字符数 CHAR 或 VARCHAR 列的类型不能小于现有的 规范。

如果列被声明为数组,则不更改其类型或其 维数是允许的。

外键中涉及的列的数据类型,主要 键或唯一约束根本无法更改。

此语句在 Firebird 1 (InterBase 6.0) 之前就已经可用。

【讨论】:

不允许使用 blob,例如更改 blob 文本列上的字符集的最佳方法是什么? @user3179515 唯一真正的方法是添加一个新列并更新以将旧列的值分配给新列(必要时使用适当的强制转换),删除旧列并重命名新列列。 @user3179515 突然有人说 BLOB 有数据丢失的风险:tracker.firebirdsql.org/browse/CORE-6052【参考方案2】:

火鸟 2.5 手册

https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref25-ddl-tbl.html

 ALTER TABLE tabname ALTER COLUMN colname TYPE typename

【讨论】:

在 Firebird 2.5 中有一些你不能做的事情。例如更改 not null 属性...在 Firebird 3.0 中没关系 @HuguesVanLandeghem 这两种方式都是正确的。如果您使用命名为DOMAINs 键入列,那么在FB2 中,您可以通过直接修改系统表将字段类型从domain 更改为另一种。在 FB3 系统表中被设为只读。但是,它们仍然不提供 SQL 用于在列定义中从 VarChar domain 更改为另一个。我现在不记得确切的目的地domain 是更长的VarChar 还是BLOB SUB_TYPE TEXT,但它不起作用

以上是关于如何更改 firebird3 中的列类型的主要内容,如果未能解决你的问题,请参考以下文章

你如何更改rails中的列数据类型?

如何更改 redbeanphp 中的列类型?

如何在不包含新列名和类型的情况下更改现有 Hive 表中的列注释?

更改 DataFrame 中的列数据类型并将其传递到 UDF - PySpark

更改熊猫中的列类型

更改熊猫中的列类型