【问题标题】:PGAdmin CREATE script sequence relation does not existPGAdmin CREATE 脚本序列关系不存在
【发布时间】:2022-01-27 11:06:45
【问题描述】:

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

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

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

关系“mytable_mykey_seq”不存在

这真的很烦人,因为我可以在对象浏览器中看到它。我什至可以从对象窗口中拖入序列:

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

得到:

关系“public.mytable_mykey_seq”不存在

如果我尝试,这也是我得到的:

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

或:

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

正如其他类似 SO 问题中所建议的那样。

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

-- 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) 正确的命名空间/约定/魔术词是什么PG能定位到这个序列吗?

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

所选答案将起作用,但您将无法按原样使用 CREATE SCRIPT 序列。

【问题讨论】:

    标签: postgresql auto-increment pgadmin-4


    【解决方案1】:

    首先,PGAdmin 不会创建任何东西。它是 Postgres 的图形界面,因为 psql 是 Postgres 的命令行界面。它 id Postgres 在做这项工作。您需要始终牢记您在谈论的是什么软件。
    其次,您的语法不正确。您可以采用 2 种方法: 让 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
    

    【讨论】:

    • 感谢“生成”语法。这就是我过去在其他地方所做的事情。但它并没有真正回答这个问题:我在 PGAdmin 中创建了一个带有序列字段的表。这将导致创建一个序列并且该字段引用该序列。这行得通。只有当我尝试使用为 CREATE 返回的脚本重新创建表时,才能找到该序列——即使它仍然存在。
    • 好的,我知道 PGAdmin 在做什么了。这些答案已经足够好了。
    【解决方案2】:

    你有 SEQUENCE mytable_mykey_seq

    创建序列 public.mytable_mykey_seq;

    ALTER SEQUENCE public.mytable_mykey_seq oikos 的所有者;

    【讨论】:

    • 是的,我不仅拥有它,它还可以工作,桌子也会使用它。只有当拉起 CREATE 脚本并尝试再次运行时,我才会收到无法找到序列的错误,即使序列是可见且可查询的。我添加了一个清晰的屏幕截图。
    猜你喜欢
    • 1970-01-01
    • 2020-01-07
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多