Postgresql

PostgreSQL 中的多個主鍵

  • December 15, 2021

我有下表:

CREATE TABLE word(
word CHARACTER VARYING NOT NULL,
id BIGINT NOT NULL,
repeat INTEGER NOT NULL
);
ALTER TABLE public.word OWNER TO postgres;
ALTER TABLE ONLY  word ADD CONSTRAINT "ID_PKEY" PRIMARY KEY (word,id);

當我嘗試使用以下命令恢復它時:

psql -U postgres -h localhost -d word -f word.sql 

它給了我這個錯誤:

不允許表“word”的多個主鍵

如何在 postgres 中使用多個主鍵?

如何在 postgres 中使用多個主鍵?

你不能。這是矛盾的 - 主鍵的定義是它是鍵,單數。你不能有超過一個。

您可以有多個unique約束。您可以擁有一個包含多個列的主鍵(複合主鍵)。但是一張表的主鍵不能超過一個。

但是,您顯示的程式碼不會產生您提到的錯誤:

$ psql -U postgres regress <<__END__
CREATE TABLE word(
word CHARACTER VARYING NOT NULL,
id BIGINT NOT NULL,
repeat INTEGER NOT NULL
);
ALTER TABLE public.word OWNER TO postgres;
ALTER TABLE ONLY  word ADD CONSTRAINT "ID_PKEY" PRIMARY KEY (word,id);
__END__
CREATE TABLE
ALTER TABLE
ALTER TABLE
$

猜測你實際上已經定義了這個表,你忽略了以前的錯誤,然後只顯示最後一個錯誤。如果我重新執行此程式碼,我會得到輸出:

ERROR:  relation "word" already exists
ALTER TABLE
ERROR:  multiple primary keys for table "word" are not allowed

當然,這裡真正的錯誤是第一個錯誤。

我強烈建議始終使用-v ON_ERROR_STOP=1in psql,例如:

$ psql -v ON_ERROR_STOP=1 -U postgres regress <<__END__
CREATE TABLE word(
word CHARACTER VARYING NOT NULL,
id BIGINT NOT NULL,
repeat INTEGER NOT NULL
);
ALTER TABLE public.word OWNER TO postgres;
ALTER TABLE ONLY  word ADD CONSTRAINT "ID_PKEY" PRIMARY KEY (word,id);
__END__

ERROR:  relation "word" already exists
$

看看它是如何在第一個錯誤處停止的?

(這將是預設設置,但這會破壞向後兼容性)。

引用自:https://dba.stackexchange.com/questions/65289