SQL 主键自增

SQL Primary Key Increment

我怎样才能拥有一个自动递增的主键? 例如:当我在字段名称中插入一些内容时,字段 ID 应该分配一个值,该值是最后一个的 +1。

id, name
 1, test1
 2, test2

所以我插入类似 testX 的名称,id 应该自动分配为 3

我该怎么做?

如果您使用的是 Firebird 3,那么您可以使用 identity column 功能:

create table T (
  id integer generated by default as identity primary key,
  ...
);

如果您使用的是一些旧版本的 Firebird,则可以使用带触发器的序列来实现自动增量:

create table T (
  id integer primary key,
  ...
);

CREATE SEQUENCE t_seq;

create trigger t_gen_id
  active before insert
  on T
as
begin
  if(new.id is null)then new.id = next value for t_seq;
end;

从 Firebird 2 开始支持 returning clause 这对于获取在服务器端生成的 id 值非常方便。

除了 ain 的答案之外,您还可以使用 generator 如:

创建生成器:

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

获取生成器当前值:

SELECT GEN_ID( <GeneratorName>, 0 ) FROM RDB$DATABASE; 

生成下一个值

 SELECT GEN_ID( <GeneratorName>, 1 ) FROM RDB$DATABASE;

在触发器中使用生成器

CREATE OR ALTER trigger <trigger_name>_bi for <table_name>
active before insert position 0
as
begin
  if (new.id is null) then
    new.id = gen_id(my_generator,1);
end

如果你想要无孔的计数,你必须非常小心。

Generators/Sequences 是非事务性的。
一旦你操作失败,你就会得到一个值,你就会有一个洞。