RDB$NULL_FLAG 对所有列都是空的

RDB$NULL_FLAG is null for all columns

我正在尝试 运行 查询以提取 Firebird 中所有列的元数据。这是它的样子:

select
      f.RDB$RELATION_NAME as tableName,
      f.RDB$FIELD_NAME name,
      fd.RDB$FIELD_TYPE type,
      fd.RDB$FIELD_SCALE scale,
      fd.RDB$FIELD_SUB_TYPE subtype,
      fd.RDB$DIMENSIONS dimensions,
      fd.RDB$NULL_FLAG notNull,
      fd.RDB$FIELD_PRECISION precision
from rdb$relation_fields f
join rdb$relations r on f.RDB$RELATION_NAME = r. RDB$RELATION_NAME
join RDB$FIELDS fd on fd.RDB$FIELD_NAME = f.RDB$FIELD_SOURCE
where f.RDB$UPDATE_FLAG = 1
  and r.RDB$RELATION_TYPE = 0
  and coalesce(r.RDB$SYSTEM_FLAG, 0) = 0

在大多数情况下,它工作正常。但无论出于何种原因,每个结果都会在 fd.RDB$NULL_FLAG 列中给出 nullAccording to the documentation,如果列可以为空,则此值应为 null,否则为 1。 (不用说,事实上,我的数据库中有一些 NOT NULL 列!)

知道出了什么问题吗?我如何才能正确报告我的列的可空性状态?

您还应该检查覆盖域定义的 f.RDB$NULL_FLAG。

为了扩展 ,table 的字段定义为两部分:RDB$RELATION_FIELDS 中的条目用于字段本身,[=] 中的域定义12=]。如果字段是用基本类型而不是(命名)域定义的,则会生成一个未命名(编号)域。

这个未命名的域没有设置RDB$NULL_FLAG,相当于CREATE DOMAIN <domainname> <basicdatatype>,也没有设置RDB$FIELDS中的RDB$NULL_FLAG。相反,NOT NULL 约束记录在 RDB$RELATION_FIELDS.RDB$NULL_FLAG.

只有在创建具有 NOT NULL 约束的显式域时,RDB$FIELDS.RDB$NULL_FLAG 才会填充 1,例如:

create domain int_not_null integer not null;

简而言之,您需要使用 - 例如 - COALESCE(f.RDB$NULL_FLAG, fd.RDB$NULL_FLAG, 0) 来确定列的可空性,其中 0 表示可为空,1 表示不可为空。

对 table 中值的类似检查也适用于 RDB$FIELDSRDB$RELATION_FIELDS 中存在的其他一些列:RDB$DEFAULT_VALUE/RDB$DEFAULT_SOURCERDB$COLLATION_ID.