Kevin-moon

学习在于分享
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Firebird的Generator(自动化序列)

Posted on 2008-11-17 11:31  Kevin-moon  阅读(1815)  评论(0)    收藏  举报

     它是线程安全的计数器,可以使用create generator 'name' 这种命令来创建,不过它不受事务的控制。
这个数据在存在RDB$GENERATORS的系统表中,GENERATOR_NAME, GENERATOR_ID, SYSTEM_FLAG, DESCRIPTION, DB_KEY这些是表中的字段,(
注意:对于用户定义的序列,system_flag是为null或0的,系统内部的都是为1).
     它的值范围是在-9,223,372,036,854,775,808到9,223,372,036,854,775,807.不过firebird的SQL dialect有dialect 1和dialect 3两种选择,在dialect 1下,它的范围是-2,147,483,648到2,147,483,647,如果增长的范围超过了,它就不会继续增长,只停留在这点上,
     并且在客户端的连接中,也可以去设定SQL dialect。这里有一种情况,当firebird对它设置是3的时候,在客户端的连接把它设置为1了,在这种情况下,利用客户端返回的值是以客户端的设置为准的,既在客户端中设置它为1,那在客户端中获取它的范围就是-2,147,483,648到2,147,483,647.

Generate(序列)的极限:


     在数据库中,最多允许创建32767个序列,所以在正常情况下,它是可以任意使用的。

Generator的SQL


CREATE GENERATOR <name>;
SET GENERATOR <name> TO <value>;
DROP GENERATOR <name>;

获取序列:
SELECT NEXT VALUE FOR <SequenceName> FROM RDB$DATABASE;或
SELECT GEN_ID( <GeneratorName>, <increment> ) FROM RDB$DATABASE;

主要用途


可以创建表的自动增长。也就是给表创建insert时候的触发器,SQL如下:
CREATE TRIGGER trgTTEST_BI_V3 for TTEST
active before insert position 0
as
begin
  if ((new.id is null) or (new.id = 0)) then
  begin
    new.id = gen_id( gidTest, 1 );
  end
end