Beberapa kunci utama di PostgreSQL

13

Saya memiliki tabel berikut:

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

Ketika saya mencoba mengembalikannya menggunakan perintah berikut:

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

ini memberi saya kesalahan ini:

beberapa kunci utama untuk "kata" tabel tidak diizinkan

Bagaimana saya bisa menggunakan beberapa kunci utama di postgres?

mostafa
sumber

Jawaban:

26

bagaimana saya bisa menggunakan beberapa kunci primer di postgres?

Kamu tidak bisa Ini sebuah oxymoron - definisi kunci utama adalah bahwa hal itu yang kunci utama, tunggal. Anda tidak dapat memiliki lebih dari satu.

Anda dapat memiliki banyak uniquekendala. Anda dapat memiliki kunci utama yang berisi banyak kolom (kunci primer gabungan). Tetapi Anda tidak dapat memiliki lebih dari satu kunci utama untuk sebuah tabel.

Namun, kode yang Anda tampilkan tidak menghasilkan kesalahan yang Anda sebutkan:

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

Pada tebakan Anda sebenarnya sudah mendefinisikan tabel ini dan Anda mengabaikan kesalahan sebelumnya, lalu hanya menunjukkan yang terakhir. Jika saya menjalankan kembali kode ini saya mendapatkan output:

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

Kesalahan sebenarnya di sini adalah yang pertama, tentu saja.

Saya sangat menyarankan selalu menggunakan -v ON_ERROR_STOP=1di psql, misalnya:

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

Lihat bagaimana itu berhenti pada kesalahan pertama?

(Ini akan menjadi default tapi itu akan merusak kompatibilitas ke belakang).

Craig Ringer
sumber