如何在firebird表中找到使用生成器的字段列表?

时间:2013-02-06 11:05:02

标签: sql firebird

如何从firebird表中选择使用生成器进行自动增量的字段名称。

2 个答案:

答案 0 :(得分:5)

你做不到。目前(从Firebird 2.5开始)Firebird中没有自动增量字段,您必须使用触发器自行模仿它们。因此,没有可用于关联序列(也称为生成器)和字段的元数据。

答案 1 :(得分:0)

好吧,这很糟糕,效率不高,但是它确实非常接近。

这将使用生成器为每个表返回“字段”的“第一”标识字段。但是这确实假设您的触发器看起来像

  NEW.My_ID = GEN_ID(My_ID_Generator,1)

如果您执行空检查(这就是为什么您需要第二个嵌套选择的原因)也可以使用

  If ((NEW.MY_ID) is NULL) then NEW.My_ID...

您可能将其设置为存储的proc或view。

Select P.TableName,
       CASE WHEN position('NEW.' in P.Body)>0 THEN
            substring(P.Body from
              (position('NEW.' in P.Body)+4)
            )
            ELSE p.Body
       END As IdentityName  
FROM
  (
  SELECT
      B.TableName,
      substring(B.Body from (position('NEW.' in B.Body)+4) for
         position('=GEN_ID' in B.Body)-(position('NEW.' in B.Body)+4)
      ) as Body
  FROM
     (
      SELECT RDB$RELATION_NAME AS TableName,
             UPPER(
               replace (
                 replace(
                   replace(
                      replace(t.RDB$TRIGGER_SOURCE,' ',''), ascii_char(13), ''
                   ), ascii_char(10), ''
                 ), ascii_char(9), ''
               )
             ) as Body
        FROM RDB$TRIGGERS t
        WHERE ((rdb$SYSTEM_FLAG IS NULL) or (t.rdb$SYSTEM_FLAG=0)) AND
             (RDB$TRIGGER_TYPE=1) and
             ((RDB$TRIGGER_INACTIVE = 0) OR (RDB$TRIGGER_INACTIVE IS NULL) ) and
             (( RDB$TRIGGER_SOURCE like '%GEN_ID%') and (RDB$TRIGGER_SOURCE like '%NEW.%'))
      ) B
) P

结果如下:

 TABLENAME  IDENTITYNAME 
 ---------  ----------- 
 My_Table   My_ID