PostgreSQL中的多个主键


13

我有下表:

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中使用多个主键?

Answers:


26

我如何在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=1在中使用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
$

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.