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
列中给出 null
。 According 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$FIELDS
和 RDB$RELATION_FIELDS
中存在的其他一些列:RDB$DEFAULT_VALUE
/RDB$DEFAULT_SOURCE
和 RDB$COLLATION_ID
.
我正在尝试 运行 查询以提取 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
列中给出 null
。 According to the documentation,如果列可以为空,则此值应为 null
,否则为 1
。 (不用说,事实上,我的数据库中有一些 NOT NULL
列!)
知道出了什么问题吗?我如何才能正确报告我的列的可空性状态?
您还应该检查覆盖域定义的 f.RDB$NULL_FLAG。
为了扩展 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$FIELDS
和 RDB$RELATION_FIELDS
中存在的其他一些列:RDB$DEFAULT_VALUE
/RDB$DEFAULT_SOURCE
和 RDB$COLLATION_ID
.