Firebird 4.0中如何将smallint域的0/1列转换为boolean类型
问题原因
INTVAL列绑定了自定义的D_BOOL域,Firebird 不支持直接修改绑定了自定义域的列的基础类型,强行执行类型变更语句就会触发你碰到的元数据更新失败报错。
转换方案
根据实际需求选择对应方案即可:
方案1:仅修改当前表的INTVAL列(不影响其他使用D_BOOL域的列)
按顺序执行以下SQL语句:
- 先解除列和原有D_BOOL域的绑定,手动继承原域的约束规则,将列转为普通SMALLINT类型
ALTER TABLE TBOOL ALTER COLUMN INTVAL TYPE SMALLINT, ALTER COLUMN INTVAL SET DEFAULT 0, ALTER COLUMN INTVAL SET NOT NULL, ADD CONSTRAINT CK_TBOOL_INTVAL CHECK (INTVAL IN (0,1));
- 将列类型转换为BOOLEAN,同步更新默认值
Firebird 会自动将列中原有0值映射为FALSE、1值映射为TRUE,不需要额外做数据转换。
ALTER TABLE TBOOL ALTER COLUMN INTVAL TYPE BOOLEAN, ALTER COLUMN INTVAL SET DEFAULT FALSE, ALTER COLUMN INTVAL SET NOT NULL;
- 删除临时添加的检查约束
BOOLEAN类型设置非空后仅允许存储TRUE/FALSE两个值,不需要额外保留0/1校验规则。
ALTER TABLE TBOOL DROP CONSTRAINT CK_TBOOL_INTVAL;
方案2:全量修改所有使用D_BOOL域的列
如果所有用到D_BOOL域的字段都需要转为BOOLEAN类型,不需要逐表逐列修改,直接修改域定义即可,所有关联列会自动同步类型、约束规则:
ALTER DOMAIN D_BOOL AS BOOLEAN DEFAULT FALSE NOT NULL CHECK (VALUE IN (FALSE, TRUE));
验证方法
转换完成后可以执行以下语句验证功能正常:
-- 插入测试数据 INSERT INTO TBOOL(ID, INTVAL) VALUES (1, TRUE); INSERT INTO TBOOL(ID, INTVAL) VALUES (2, FALSE); -- 查询验证结果 SELECT ID, INTVAL FROM TBOOL;
内容的提问来源于stack exchange,提问作者ebelair
相关产品推荐
相关产品推荐

