它是线程安全的计数器,可以使用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