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
我一直在使用 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