PGAdmin CREATE 脚本序列关系不存在

PGAdmin CREATE script sequence relation does not exist

我一直在使用 PGAdmin 创建 tables 并且我有一个我想要自动添加的字段,PGAdmin 将创建一个序列。然后我想以某种方式编辑 table,所以我拉出包含以下行的 CREATE 脚本:

CREATE TABLE IF NOT EXISTS public.mytable
(
    mykey bigint NOT NULL DEFAULT nextval('mytable_mykey_seq'::regclass),

总是,当我尝试执行此操作时,我会看到:

relation "mytable_mykey_seq" does not exist

这真的很烦人,因为我可以在对象浏览器中看到它。我什至可以从对象 window:

中拖入序列
mykey bigint NOT NULL DEFAULT nextval('public.mytable_mykey_seq'::regclass),

并得到:

relation "public.mytable_mykey_seq" does not exist

这也是我尝试得到的结果:

mykey bigint NOT NULL DEFAULT nextval('"public".mytable_mykey_seq'::regclass),

或:

mykey bigint NOT NULL DEFAULT nextval('public."mytable_mykey_seq"'::regclass),

如其他类似 SO 问题中所建议。

每当我尝试 运行 为带有序列的 table 创建脚本时,总是会发生这种情况。这是最小的用例脚本:

-- Table: public.mytable

-- DROP TABLE IF EXISTS public.mytable;

CREATE TABLE IF NOT EXISTS public.mytable
(
    mykey integer NOT NULL DEFAULT nextval('mytable_mykey_seq'::regclass),
    CONSTRAINT mytable_pkey PRIMARY KEY (mykey)
)

TABLESPACE pg_default;

ALTER TABLE IF EXISTS public.mytable
    OWNER to oikos;

“oikos”是我的登录名;我是唯一的用户。 PGAdmin 4 (6.3) 的最新版本。 Postgres 版本 12.3,我相信。

我的问题是:a) 我在 PGAdmin 中做错了什么,如果有的话?;* b) 什么是正确的namespace/convention/magic字有PG能定位到这个序列吗?

* 好的,PGAdmin 所做的是 预期 将没有序列,然后在脚本实际执行之前使脚本失败 运行秒。因此,在尝试 运行 脚本之前和尝试失败之后,序列都存在。

尽管所选答案有效,但您将无法按原样为序列使用 CREATE SCRIPT。

你有序列mytable_mykey_seq

创建序列public.mytable_mykey_seq;

改变序列public.mytable_mykey_seq oikos 的所有者;

首先,PGAdmin 不会创建任何东西。它是 Postgres 的图形界面,因为 psql 是 Postgres 的命令行界面。它是 Postgres 做的工作。您需要时刻牢记您正在使用的是什么软件
其次,你的语法不正确。您可以采用两种方法: 让 Postgres 创建序列(这似乎是您想要的)。另一种方法是手动创建序列,然后手动将序列指定为默认序列(第二部分是您实际所做的)。当您指定 serial/bigserial 而不是实际数据类型时,Postgres 生成并命名并设为默认值。所以(对于 10 之前的版本)

CREATE TABLE IF NOT EXISTS public.mytable
(
    mykey serial primary key, ...
); 

对于版本 10 及之后使用 Generated Identity

CREATE TABLE IF NOT EXISTS public.mytable
    (
        mykey bigint generated always as identity primary key, ... 
    ); 

使用手动方法,您需要先 create the sequence

create sequence mytable_mykey_seq;  --parameters and needed