SQL主键增量

时间:2017-03-07 10:46:39

标签: sql firebird

如何拥有自动递增的主键? 例如:当我在字段名称处插入内容时,字段ID应该指定一个与最后一个值相对应的值。

id, name
 1, test1
 2, test2

所以我插入类似testX的名称,id应自动指定为3

我该怎么做?

2 个答案:

答案 0 :(得分:5)

除了回答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

如果你想要没有洞的数字,你必须非常小心。

生成器/序列是非事务性的 一旦你的操作失败就得到一个值,你就会有一个漏洞。

答案 1 :(得分:4)

如果您使用的是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值非常方便。