问题描述
我正在尝试更改 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,但它也不允许我这样做。有人可以帮我吗?
解决方法
从 Firebird 3 开始,不再允许直接修改系统表(极少数例外);参见 Changes to System Tables 和 System Tables are Now Read-only。甚至在 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;