首页 > 解决方案 > 在 Firebird 的 RDB$FIELDS 表中更改 varchar 的大小

问题描述

我正在尝试更改我的 FAIXA_VALORES 表的 CODE 字段的 varchar 大小,但是当尝试使用以下代码更改它时:

update RDB$FIELDS set
    RDB$FIELD_LENGTH = 50,
    RDB$CHARACTER_LENGTH = 50
    where RDB$FIELD_NAME = 'RDB$14392222'

但它返回给我以下错误:

不允许对系统表 RDB$FIELDS 执行 UPDATE 操作。

我已经尝试过使用 alter table,但它也不允许我这样做。有人可以帮助我吗?

标签: sqlfirebirdfirebird-3.0

解决方案


自 Firebird 3 起,不再允许直接修改系统表(极少数例外);请参阅对系统表的更改和系统表现在是只读的。甚至在 Firebird 3 之前,也不推荐这种做法

要更改列的大小,您需要使用ALTER TABLE,例如

alter table YOUR_TABLE
  alter column YOUR_COLUMN type varchar(50)

这种变化有许多限制。例如,不可能将列更改为比其当前定义短。因此,将 VARCHAR(60) 更改为 VARCHAR(50) 是不可能的。如果您需要这样做,那么您需要添加一个新列,将内容从旧列复制到新列(必要时进行修改),删除旧列并重命名新列:

alter table YOUR_TABLE add NEW_COLUMN varchar(50);
commit;
update YOUR_TABLE set NEW_COLUMN = substring(YOUR_COLUMN from 1 for 50);
commit;
alter table drop YOUR_COLUMN;
alter table alter column NEW_COLUMN to YOUR_COLUMN;
commit;

推荐阅读