如何更改 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 中的列类型的主要内容,如果未能解决你的问题,请参考以下文章
如何在不包含新列名和类型的情况下更改现有 Hive 表中的列注释?