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)
看看它如何在第一个错误处停止?
(这将是默认设置,但会破坏向后兼容性)。
您可以像这样定义一个表:
CREATE TABLE mytable (
field1 INTEGER,
field2 INTEGER,
PRIMARY KEY (field1, field2)
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
64335 次 |
| 最近记录: |