我一直在使用 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 能夠定位這個序列的正確命名空間/約定/魔術詞是什么?
uj5u.com熱心網友回復:
你有序列 mytable_mykey_seq
創建序列 public.mytable_mykey_seq;
更改序列 public.mytable_mykey_seq 所有者為 oikos;
uj5u.com熱心網友回復:
首先 PGAdmin 不創建任何東西。它是 Postgres 的圖形界面,也是 Postgres 的推薦psql行界面。它 id Postgres 正在做這項作業。你需要時刻記住你在說什么軟體。
其次,你的語法不正確。您可以采用兩種方法: 讓 Postgres 創建序列(這似乎是您想要的)。另一種方法是手動創建序列,然后手動將序列指定為默認(第二部分是您實際所做的)。當您指定串行/大串行而不是實際資料型別時,Postgres 會生成并命名并設為默認值。所以(對于 10 之前的版本)
CREATE TABLE IF NOT EXISTS public.mytable
(
mykey serial primary key, ...
);
對于版本 10 及之后的版本,使用生成的身份
CREATE TABLE IF NOT EXISTS public.mytable
(
mykey bigint generated always as identity primary key, ...
);
使用手動方法,您需要首先創建序列
create sequence mytable_mykey_seq; --parameters and needed
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/396776.html
