PostgreSQL'de birden çok birincil anahtar


13

Aşağıdaki tablo var:

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);

Aşağıdaki komutu kullanarak geri yüklemeye çalıştığımda:

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

bana bu hatayı veriyor:

"word" tablosu için birden çok birincil anahtara izin verilmiyor

Postgres'te birden çok birincil anahtarı nasıl kullanabilirim?

Yanıtlar:


26

postgres'de birden çok birincil anahtarı nasıl kullanabilirim?

Yapamazsın. Bu bir oksimoron - birincil anahtarın tanımı , birincil anahtar, tekil olmasıdır. Birden fazla olamaz.

Birden fazla uniquekısıtlamanız olabilir. Birden çok sütun içeren bir birincil anahtarınız olabilir (bileşik birincil anahtar). Ancak bir tablo için birden fazla birincil anahtarınız olamaz.

Ancak, gösterdiğiniz kod bahsettiğiniz hataya neden olmaz:

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

Bir tahminde aslında bu tabloyu zaten tanımladınız ve önceki hataları görmezden geliyorsunuz, sonra sadece sonuncuyu gösteriyorsunuz. Bu kodu yeniden çalıştırmak çıktı almak:

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

Buradaki gerçek hata elbette ilk hata.

Şiddetle hep kullanmanızı tavsiye -v ON_ERROR_STOP=1içinde psqlörneğin:

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

İlk hatada nasıl durduğunu görüyor musunuz?

(Varsayılan olurdu, ancak geriye dönük uyumluluk bozulur).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.