You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebird 4.0中如何将smallint域的0/1列转换为boolean类型

问题原因

INTVAL列绑定了自定义的D_BOOL域,Firebird 不支持直接修改绑定了自定义域的列的基础类型,强行执行类型变更语句就会触发你碰到的元数据更新失败报错。

转换方案

根据实际需求选择对应方案即可:

方案1:仅修改当前表的INTVAL列(不影响其他使用D_BOOL域的列)

按顺序执行以下SQL语句:

  1. 先解除列和原有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));
  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;
  1. 删除临时添加的检查约束
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 19:18:21