web-dev-qa-db-ja.com

PostgreSQLの複数の主キー

次の表があります。

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で複数の主キーを使用するにはどうすればよいですか?

13
mostafa

postgresで複数の主キーを使用するにはどうすればよいですか?

できません。それはoxymoronです-主キーの定義はそれがthe主キー、単数であることです。複数指定することはできません。

複数の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

もちろん、本当のエラーは最初のエラーです。

psqlでは常に-v ON_ERROR_STOP=1を使用することを強くお勧めします。例:

$ 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
$

最初のエラーで停止する方法を確認しますか?

(これがデフォルトですが、下位互換性が失われます)。

26
Craig Ringer