如何找到哪个表列对应Firebird数据库中的约束?

时间:2014-08-11 03:35:11

标签: firebird firebird2.5 flamerobin

我有一个传统的Firebird(版本2.5.2)数据库,并使用FlameRobin(版本0.0.2.1851)来检查它。

我在RDB $ RELATION_CONSTRAINTS表上运行了以下查询,以搜索名为' INTEG_172':

的约束
SELECT *
FROM RDB$RELATION_CONSTRAINTS a
WHERE RDB$CONSTRAINT_NAME = 'INTEG_172'

该查询将RDB $ RELATION_NAME列返回为“会议”列。我假设的是会议桌。但我现在的问题是:如何找出此约束所属的会议表中的哪一列?

3 个答案:

答案 0 :(得分:2)

我最初认为无法推断某些约束的列名,但事实证明NOT NULL约束实际上是作为CHECK约束实现的。

我已经在his answer中扩展了Ed Mendez的查询,还包括检查约束,这些约束应该为您提供所有约束以及它们使用的表和列(目标表+外键列除外)我太懒了,不能包括RDB$REF_CONSTRAINTS):

SELECT RDB$CONSTRAINT_NAME, RDB$CONSTRAINT_TYPE, 
       RDB$RELATION_NAME, RDB$FIELD_NAME
FROM (
    SELECT REL_CONS.RDB$CONSTRAINT_NAME, REL_CONS.RDB$CONSTRAINT_TYPE, 
           REL_CONS.RDB$RELATION_NAME, ISEG.RDB$FIELD_NAME 
    FROM RDB$RELATION_CONSTRAINTS REL_CONS
    INNER JOIN RDB$INDEX_SEGMENTS ISEG
        ON ISEG.RDB$INDEX_NAME = REL_CONS.RDB$INDEX_NAME
    UNION ALL
    SELECT REL_CONS.RDB$CONSTRAINT_NAME, REL_CONS.RDB$CONSTRAINT_TYPE, 
           REL_CONS.RDB$RELATION_NAME, CH_CONS.RDB$TRIGGER_NAME 
    FROM RDB$RELATION_CONSTRAINTS REL_CONS
    INNER JOIN RDB$CHECK_CONSTRAINTS CH_CONS
        ON CH_CONS.RDB$CONSTRAINT_NAME = REL_CONS.RDB$CONSTRAINT_NAME
) a
WHERE a.RDB$CONSTRAINT_NAME = 'INTEG_172'

答案 1 :(得分:1)

希望这就是你要找的......

SELECT RDB$INDEX_SEGMENTS.RDB$FIELD_NAME 
FROM   RDB$RELATION_CONSTRAINTS
INNER JOIN RDB$INDEX_SEGMENTS 
    on ( RDB$INDEX_SEGMENTS.RDB$INDEX_NAME = RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME )
WHERE RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_NAME = 'INTEG_172'

答案 2 :(得分:0)

我只是这样做:

显示表会议; (通过sql)

并阅读约束定义