PostgreSQL 中的多个主键

mos*_*afa 15 postgresql primary-key

我有下表:

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);
Run Code Online (Sandbox Code Playgroud)

当我尝试使用以下命令恢复它时:

psql -U postgres -h localhost -d word -f word.sql 
Run Code Online (Sandbox Code Playgroud)

它给了我这个错误:

不允许表“word”的多个主键

如何在 postgres 中使用多个主键?

Cra*_*ger 29

我如何在 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
$
Run Code Online (Sandbox Code Playgroud)

猜测您实际上已经定义了这个表并且您忽略了之前的错误,然后只显示了最后一个。如果我重新运行此代码,我会得到输出:

ERROR:  relation "word" already exists
ALTER TABLE
ERROR:  multiple primary keys for table "word" are not allowed
Run Code Online (Sandbox Code Playgroud)

当然,这里真正的错误是第一个。

我强烈建议始终使用-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
$
Run Code Online (Sandbox Code Playgroud)

看看它如何在第一个错误处停止?

(这将是默认设置,但会破坏向后兼容性)。


Dem*_*tri 9

您可以像这样定义一个表:

CREATE TABLE mytable (
    field1 INTEGER,
    field2 INTEGER,
    PRIMARY KEY (field1, field2)
);
Run Code Online (Sandbox Code Playgroud)