gpt4 book ai didi

sql - RDB$NUL​​L_FLAG 所有列均为空

转载 作者:行者123 更新时间:2023-12-02 02:08:02 27 4
gpt4 key购买 nike

我正在尝试运行查询来提取 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$NUL​​L_FLAG 列中给出 nullAccording to the documentation ,如果列可为空,则该值应为 null;如果不可为空,则该值应为 1。 (不用说,事实上,我的数据库中确实有一些 NOT NULL 列!)

知道出了什么问题,以及如何正确报告我的列的可为空状态吗?

最佳答案

扩展answer by user13964273 ,表的字段由两部分定义: RDB$RELATION_FIELDS 中的条目对于字段本身,以及 RDB$FIELDS 中的域定义。如果使用基本类型而不是(命名)域定义字段,则会生成未命名(编号)域。

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

RDB$FIELDS.RDB$NULL_FLAG仅填充 1使用 NOT NULL 创建显式域时约束,例如:

create domain int_not_null integer not null;

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

对两个表中的值进行类似检查也适用于 RDB$FIELDS 中存在的其他一些列。和RDB$RELATION_FIELDS :RDB$DEFAULT_VALUE/RDB$DEFAULT_SOURCERDB$COLLATION_ID .

关于sql - RDB$NUL​​L_FLAG 所有列均为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68118232/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com