gpt4 book ai didi

database - 始终使用序列列中的下一个序列(不允许用户值)

转载 作者:搜寻专家 更新时间:2023-10-30 21:49:50 24 4
gpt4 key购买 nike

在 PostgreSQL 中,我想创建一个带有自动增量列的表,用户无法在其中指定自定义值。

在 Oracle 中,您有两种创建自增列的方法。

在第一个示例中,如果用户不指定值,id 列会自动递增。这是 SERIAL 在 postgres 中的当前实现。

CREATE TABLE identity_test_tab ( 
id NUMBER GENERATED BY DEFAULT AS DENTITY,
description VARCHAR2(30)
);

在下一个示例中,id 列总是自动递增,用户不能指定任何其他值。

CREATE TABLE identity_test_tab (
id NUMBER ALWAYS AS IDENTITY,
description VARCHAR2(30)
);

我想知道 postgres 中第二个例子的等价物?

最佳答案

如果你想确保值总是取自你需要一个触发器的序列。在 Postgres 中没有与 generated always 等价的东西:

create table foo (id integer not null primary key);
create sequence foo_id_seq;
alter sequence foo_id_seq owned by foo.id; -- this is essentially what `serial` does in the background

create function generate_foo_id()
returns trigger
as
$$
begin
new.id := nextval('foo_id_seq');
return new;
end;
$$
language plpgsql;

create trigger foo_id_trigger
before insert on foo
for each row execute procedure generate_foo_id();

上面的代码会默默地用序列值替换任何用户为 foo.id 提供的值。如果您希望在执行此操作时出现显式错误,请在触发器函数中引发异常:

create function generate_foo_id()
returns trigger
as
$$
begin
if new.id is not null then
raise 'No manual value for id allowed';
end if;
new.id := nextval('foo_id_seq');
return new;
end;
$$
language plpgsql;

引发异常会中止当前事务,并强制应用程序插入值回滚并正确执行。

关于database - 始终使用序列列中的下一个序列(不允许用户值),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38036069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com