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 是非事务性的。
一旦你操作失败,你就会得到一个值,你就会有一个洞。
我怎样才能拥有一个自动递增的主键? 例如:当我在字段名称中插入一些内容时,字段 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 是非事务性的。
一旦你操作失败,你就会得到一个值,你就会有一个洞。