如何从使用生成器进行自动增量的 firebird 表中选择字段名称。
问问题
709 次
2 回答
5
你不能。目前(从 Firebird 2.5 开始)Firebird 中没有自动增量字段,您必须自己使用触发器来模仿它们。因此,没有可用于关联序列(又名生成器)和字段的元数据。
于 2013-02-06T11:31:24.620 回答
0
好吧,这很 HACKY,效率不高,但它非常接近。
这将使用每个表的生成器返回字段的 FIRST 标识字段。但这确实假设您的触发器看起来像
NEW.My_ID = GEN_ID(My_ID_Generator,1)
如果你有一个空检查它也可以工作(这就是你需要第二个嵌套选择的原因)
If ((NEW.MY_ID) is NULL) then NEW.My_ID...
您可以将其设为存储过程或视图。
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
于 2020-09-27T06:02:11.693 回答